Вы можете отсортировать список на основе повторений, используя 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());