JAVA - 如何通过比较LIST中的多个值,使用比较器对OBJECT列表进行排序

时间:2011-12-08 08:18:03

标签: java list sorting comparator

我对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}
    }
}

我已经尝试使用比较器,但我只能比较一次值。 谢谢你的回复。

5 个答案:

答案 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)

假设:

  • 您正在使用Java 8 +
  • 您要先按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();
}