Сортировка списка на основе значений повторения - PullRequest
2 голосов
/ 18 февраля 2020

У меня есть список строк, подобный этому: {3,2,2,1,1,1,1,4,4,4} И я хочу отсортировать его по количеству повторений значений, чтобы быть этим {1 , 1,1,1,2,2,4,4,4,3} Спасибо за внимание

1 Ответ

3 голосов
/ 18 февраля 2020

Вы можете отсортировать список на основе повторений, используя Collections.frequency с Comparator.comparingInt

Comparator.comparingInt(i->Collections.frequency(list, i)).reversed()

Ниже приведен пример

    List<Integer>  list = new ArrayList<>(List.of(3,2,2,1,1,1,1,4,4,4));

    System.out.println(list);

    list.sort(Comparator.comparingInt(i->Collections.frequency(list, i)).reversed());

    System.out.println(list);  //[1, 1, 1, 1, 4, 4, 4, 2, 2, 3]

Вместо проверки частоты каждого элемента в Списке, вы можете сделать это другим способом, сгруппировав элемент и сосчитав в Map<Integer, Long>, а затем создав другой отсортированный список Collections.nCopies

List<Integer> result = list.stream()
                       .collect(Collectors.groupingBy(Function.identity(),Collectors.counting()))
                       .entrySet()
                       .stream()
                       .sorted(Map.Entry.comparingByValue(Comparator.reverseOrder()))
                       .map(entry->Collections.nCopies(entry.getValue().intValue(), entry.getKey()))
                       .flatMap(List::stream)
                       .collect(Collectors.toList());
...