Как отсортировать СПИСОК ОБЪЕКТА с помощью компаратора путем сравнения многослойных значений внутри СПИСКА - PullRequest
1 голос
/ 08 декабря 2011

У меня есть вопрос относительно Java Comparator. Или, может быть, у всех вас есть другая идея для решения этой проблемы.

У меня есть объект с именем Product, ниже класса Product выглядит так:

public class Product(){
   private String productId;
   private List categoryList;

   //...setter and getter for category 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 голосов
/ 24 ноября 2018

Предполагая:

  • вы используете Java 8 +
  • вы хотите сначала отсортировать по productId, затем по categoryList
  • categoryList содержит сопоставимые элементы (например, строки или целые числа)
  • categoryList s следует сравнивать попарно (начиная с самой старшей пары), используя естественное упорядочение

Затем вы можете использовать что-то вроде этого:

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();
}
0 голосов
/ 09 декабря 2011

Томас вдохновил меня на решение этой проблемы. Проблема только в том, что я сравниваю продукт на основе нескольких значений. Это означает, что объектом является отношение многих ко многим.

То, что я делаю, просто, просто напишите класс компаратора, чтобы сравнить категорию продуктов. ГЛАВНЫЙ КЛЮЧ - сделать сортировку для каждой категории.

ProductCategoryComparator comparator = new ProductCategoryComparator();
for (int i = 1 ; i < catKeyList.size() ; i++){
   comparator.setCategoryKey((String)catKeyList.get(i));
   Collections.sort(productList, comparator);
}

Надеюсь, что этот ответ поможет всем, у кого может быть похожая проблема.

0 голосов
/ 08 декабря 2011

Сначала пусть ваш класс Product реализует интерфейс Comparable, затем реализует compareTo (), затем сортирует список с Collections.sort (myList);

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);
0 голосов
/ 08 декабря 2011

Вы можете реализовать Comparable в Product и использовать Collections.sort ().Вам также нужно будет сделать списки сопоставимыми и использовать их в Product.compareTo ().

0 голосов
/ 08 декабря 2011

Не уверен, что вы уже пробовали это, но вы можете переопределить сопоставимый интерфейс и сравнить все, что хотите со значениями в списке.

Проблема, конечно, в том, что вам нужно найти согласованный алгоритм сравнения.Можете ли вы определить, является ли продукт «большим» или «меньшим» в зависимости от категорий, к которым он относится?Сортировка требует такого однозначного, одномерного решения ...

В противном случае, похоже, что вы захотите поместить вещи в базу данных и выполнить операции для каждой категории

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...