Collectors.groupingBy () возвращает результат, отсортированный в порядке возрастания Java - PullRequest
0 голосов
/ 05 сентября 2018

Я отправляю результат в порядке убывания, но получаю вывод в порядке возрастания

List<myEntity> myData = new ArrayList<>();
Map<Integer,List<myEntity>> myid = new LinkedHashMap<>();

try {
    myData = myService.getData(id); 
    myid = myData.stream().collect(Collectors.groupingBy(myEntity::getDataId)); 

Здесь mydata сортируется по порядку desc, но после создания коллекций по id группы данных мой список сортируется в порядке возрастания. Я хочу, чтобы список моей коллекции был в порядке убывания, а не в порядке возрастания.

Ответы [ 4 ]

0 голосов
/ 06 сентября 2018

Collectors.groupingBy возвращает HashMap без какого-либо заказа как такового (относительно того, почему вы видите, что "некоторый заказ" объяснен здесь ). Правильный способ сделать это - указать Map, который сохраняет порядок внутри Collectors.groupingBy:

myData.stream()
      .collect(Collectors.groupingBy(
          MyEntity::getDataId,
          LinkedHashMap::new,
          Collectors.toList()     

))
0 голосов
/ 05 сентября 2018

Как @Holger, описанный в Java 8 не поддерживает порядок при группировке , Collectors.groupingBy () возвращает HashMap, который не гарантирует порядок.

Вот что вы можете сделать:

myid = myData.stream()
.collect(Collectors.groupingBy(MyEntity::getDataId,LinkedHashMap::new, toList()));

Вернет LinkedHashMap<Integer, List<MyEntity>>. Порядок также будет поддерживаться, так как список, используемый сборщиком - ArrayList.

0 голосов
/ 05 сентября 2018

Вам нужен обратный порядок карты. Итак, в java 8 я решил это.

myData = myService.getData(id);
myid = myData.stream().collect(Collectors.groupingBy(myEntity::getDataId));

Map<Integer, List<myEntity>> finalMap = new LinkedHashMap<>();
myid.entrySet().stream()
        .sorted(Map.Entry.<Integer, List<myEntity>>comparingByKey()
                .reversed())
        .forEachOrdered(e -> finalMap.put(e.getKey(), e.getValue()));
System.out.println("FINAL RESULT : " + finalMap);

Entryset дает нам Integers этой карты myid. Таким образом, sort и получают с первой карты, которая myid и , помещают в finalMap

0 голосов
/ 05 сентября 2018

collect(Collectors.groupingBy()) возвращает новый Map, который перезаписывает переменную на ваш предыдущий LinkedHashMap. Поэтому ваше первоначальное назначение бесполезно. Точный возвращенный тип не определен спецификациями, но в моем тестовом прогоне он вернул HashMap. (Никогда не думайте, что так будет всегда в разных версиях и брендах Java!)

Но главная проблема в том, что вы храните Integer в качестве ключей. Если значения этих ключей меньше модуля таблицы внутри HashMap, они будут казаться упорядоченными (потому что hashCode из Integer - это просто значение; значение s). Когда я тестировал с 1000 Integer значениями 0..999, хеш-таблица (массив как часть внутренней обработки HashMap), казалось, имела размер 2048. (Опять же, недокументированный, так что не принимайте это!)

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

...