根据重复值对列表进行排序

时间:2020-02-18 04:25:15

标签: java sorting arraylist duplicates

我有一个像这样的字符串列表:{3,2,2,1,1,1,1,4,4,4}而且我想按值的重复数量对其进行排序,以使它成为{1 ,1,1,1,2,2,4,4,4,3}感谢您的关注

1 个答案:

答案 0 :(得分:3)

您可以使用Collections.frequencyComparator.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中每个元素的出现频率
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());