Как отсортировать список > по убыванию key1 и по возрастанию key2, если key1 имеет одинаковые значения - PullRequest
3 голосов
/ 18 марта 2020

У меня есть список

List<Map<String,String>> list = new ArrayList<>();
            Map<String,String> map = new HashMap<>();
            Map<String,String> map1 = new HashMap<>();
            Map<String,String> map2 = new HashMap<>();
            map.put("productNumber", "107-001");
            map1.put("productNumber", "108-001");
            map2.put("productNumber", "109-001");
            map.put("price", "1.99");
            map1.put("price", "1.02");
            map2.put("price", "1.99");
            list.add(map);
            list.add(map1);
            list.add(map2);

Я сортирую его по цене и получаю результат

formattedResult = list.stream().sorted(Comparator.comparing(m -> Double.parseDouble(m.get("price")))).collect(Collectors.toList());
            Collections.reverse(formattedResult);

Результат такой:

**price  productNumber**
1.99   109-001
1.99   107-001
1.02   108-001

Я хочу Сортируйте это как

**price  productNumber**
    1.99   107-001
    1.99   109-001
    1.02   108-001

Если цены равны - сравните по номеру продукта, в конце должен стоять productNumber с меньшим значением. Пожалуйста, помогите!

Ответы [ 3 ]

3 голосов
/ 18 марта 2020

Вам не нужно инвертировать результат, если вы используете правильный компаратор (и вы также можете связать компараторы):

    final Comparator<Map<String, String>> byPrice = Comparator.comparing(m -> Double.parseDouble(m.get("price")), Comparator.reverseOrder());

    formattedResult = list.stream().sorted(byPrice.thenComparing(m -> m.get("productNumber"))).collect(Collectors.toList());
2 голосов
/ 18 марта 2020

Вы можете создать обратный компаратор для productNumber

 Comparator<Map<String, String>> productNumberReversed =  Comparator.comparing((Map<String, String> mp) -> mp.get("productNumber")).reversed();

, а затем добавить его для сравнения метода сортировки, используя thenComparing

formattedResult = list.stream()
           .sorted(Comparator.comparing((Map<String, String> m) -> Double.parseDouble(m.get("price"))).thenComparing(productNumberReversed)).collect(Collectors.toList());
    Collections.reverse(formattedResult);
2 голосов
/ 18 марта 2020

Будет проще, если вы построите свой Comparator в два этапа. Так что попробуйте и распечатайте их. Это работает следующим образом.

  • сначала сортирует цену в обратном порядке.
  • Затем t сортирует номер продукта в обычном порядке по равным ценам.
    Comparator<Map<String, String>> comp = Comparator
        .comparing(m ->Double.parseDouble(m.get("price"))
                         ,Comparator.reverseOrder());
    comp = comp.thenComparing(m -> m.get("productNumber"));

Примените это так.

        List<Map<String, String>> formattedResult =
                list.stream().sorted(comp)  
                        .collect(Collectors.toList());


        formattedResult.forEach(m -> System.out.println(
                m.get("price") + " : " + m.get("productNumber")));

Это печатает

1.99 : 107-001
1.99 : 109-001
1.02 : 108-001


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