我对Java Comparator有疑问。或者也许你们都有另一个想法来解决这个问题。
我有一个名为Product的对象,在Product Class下面看起来像:
public class Product(){
private String productId;
private List categoryList;
//...setter and getter for category List
}
然后我有一个Product,List列表。我想根据产品类别对列表进行排序:
这里是List的例子:
{
Product = {
productId:10000567,
categoryList: {1002, 1003, 1007}
},
Product = {
productId:10000568,
categoryList: {1001, 1003, 1007}
},
Product = {
productId:10000569,
categoryList: {1001, 1004, 1007}
},
Product = {
productId:10000570,
categoryList: {1004, 1005, 1007}
}
}
我已经尝试使用比较器,但我只能比较一次值。 谢谢你的回复。
答案 0 :(得分:0)
不确定您是否已经尝试过此操作,但是您可以覆盖comparable interface并且可以将所需内容与列表中的值进行比较。
问题是,当然,您需要找到一致的比较算法。您能否确定某个产品是“更大”还是“更小”,具体取决于它所属的类别?排序需要这种明确的,一维的决定......
否则,您可能希望将内容放入数据库并按类别执行操作
答案 1 :(得分:0)
首先,让您的类Product实现Comparable接口,然后实现compareTo(),然后使用Collections.sort(myList)对List进行排序;
public class Product implements Comparable<Product>{
private String productId;
private List categoryList;
//...setter and getter for category List
public int compareTo(Product p) {
//return -1, 0 or 1 based on what you decide makes p to be less than this
}
}
//sort it
java.util.Collections.sort(myProductList);
答案 2 :(得分:0)
您可以在Product中实现Comparable并使用Collections.sort()。您还必须使列表也可比较,并在Product.compareTo()中使用它。
答案 3 :(得分:0)
我所做的很简单,只需编写比较器类来比较产品的类别。主键是对每个类别进行排序。
ProductCategoryComparator comparator = new ProductCategoryComparator();
for (int i = 1 ; i < catKeyList.size() ; i++){
comparator.setCategoryKey((String)catKeyList.get(i));
Collections.sort(productList, comparator);
}
希望这个答案可以帮助每个可能遇到类似问题的人。
答案 4 :(得分:0)
假设:
productId
,然后按categoryList
categoryList
包含可比字符(例如字符串或整数)categoryList
应该使用自然顺序成对比较(从最高有效对开始)然后您可以使用类似这样的内容:
public static void main(String... args) {
var p1 = new Product("1", List.of(1001, 1003, 1007));
var p21 = new Product("2", List.of(1002, 1003, 1004));
var p22 = new Product("2", List.of(1002, 1002, 1003));
var p23 = new Product("2", List.of(1001, 1002, 1003));
var p3 = new Product("3", List.of(1001, 1002, 1003));
var products = new ArrayList<>(List.of(p3, p1, p21, p22, p23));
Comparator<Product> productIdComparator = Comparator.comparing(product -> product.productId);
Comparator<Product> combinedComparator = productIdComparator
.thenComparing(product -> product.categoryList, comparingListElements(3));
products.sort(combinedComparator); // result: p1 p21 p22 p23 p3
}
private static <T extends Comparable<? super T>> Comparator<List<T>> comparingListElements(final int listSize) {
return IntStream.range(0, listSize)
.mapToObj(index -> Comparator.comparing((List<T> list) -> list.get(index)))
.reduce(Comparator::thenComparing)
.orElseThrow();
}