我有以下对象:
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的对象,并且不像客户端那样解析它。
答案 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(...)。