按列表类型属性的Java排序对象

时间:2015-05-26 17:42:04

标签: java sorting guava

我有以下对象:

failbit

我有:

public class Shipping {
    String name;
    List<Method> methods;
}

public class Method {
    String serviceType;
    String cost;
}

我想通过返回最便宜费用的方法对运费进行排序。

示例:

List<Shipping> shippings;

会按照以下方式对其进行排序:

shipping: "Josh" with 2 methods: "Premium","5" and "Basic","3"
shopping: "Nash" with 2 methods: "Prem", "7" and "Base","2"

我需要它来返回方法成本最低的方法作为第一个方法,同时排序方法以获得最便宜的方法。

最好的方法是什么?我正在使用Java 8,如果它有更好的解决方案,并且有shopping: "Nash" with 2 methods: "Base","2" and "Prem", "7" shopping: "Josh" with 2 methods: "Basic","3" and "Premium","5"

修改 成本是一个浮点数。我需要将它保留为String,因为它是我传递给REST api的对象,并且不像客户端那样解析它。

5 个答案:

答案 0 :(得分:3)

我们假设所有的发货都至少有一种方法。所以你想要按成本对发货方法进行分类。所以,让我们这样做:

shippings.forEach(shipping -> {
    shipping.getMethods().sort(Comparator.comparing(Method::getCost));
});

然后,您希望按照其方法的最低成本对送货清单进行排序。最低成本是第一种方法的成本,因为它们现在已经分类:

shippings.sort(Comparator.comparing(shipping -> shipping.getMethods().get(0).getCost()));

请注意,这假设您希望按字典顺序比较成本。如果,正如我怀疑的那样,成本实际上是一个数字,那么它应该存储在Method类中,而不是作为String存储。所以把它变成一个Integer或BigDecimal,或者任何合适的类型。

答案 1 :(得分:1)

您需要比较器或实现Comparable for Method类,如:

public class Method implements Comparable<Method> {
    public int compareTo(Method thatMethod) {
        return Integer.compare(Integer.parseInt(this.cost), Integer.parseInt(thatMethod.getCost()));//if you need name then you could do this.cost.compareTo(thatMethod.getServiceType()); assuming serviceType can never be null 
    }
}

然后按照以下方式对列表进行排序:

Collections.sort(methods);

答案 2 :(得分:1)

您可以先对methods列表中每个Shipping个实例的shippings字段进行排序,然后按每个实例的第一个元素对shippings列表进行排序&#39; s methods列表:

for (Shipping shipping : shippings)
    shipping.methods.sort((m1, m2) -> Integer.compare(m1.cost, m2.cost));

shippings.sort((s1, s2) -> 
  Integer.compare(s1.methods.get(0).cost, s2.methods.get(0).cost));

您可能需要做一些额外的工作,将成本转换为整数,但总体思路是一样的。

答案 3 :(得分:1)

您可以定义新的Comparator来定义您的排序条件,如下所示:

Comparator<Shipping> shippingComparator = new Comparator<Shipping>{
public int compare(Shipping obj1, Shipping obj2) {
    //your rules for comparing Shipping1, Shipping 2 goes here
    //return -1 when obj1 should be before obj2
    //return 1 when obj1 should be after obj2
    //return 0 when obj1 is equal to obj2 and relative position doesnt matter
} 

然后使用此比较器对List进行排序:

ArrayList<Shipping> shippings;
//populate List
Collections.sort(shippings, shippingComparator );

答案 4 :(得分:0)

我建议你阅读Java的订购tutorial。您的要求似乎表明您希望按其Shipping对每个Method实例进行排序,以及您希望对按字母顺序排序的Shipping个实例集合进行排序的其他位置,但不是完全清楚你所写的内容。

无论如何,一旦您阅读本教程,这是很简单的。总之,您可以使用Comparator或通过实现Comparable来执行此操作,只需在数据集上调用Collections.sort(...)。