基于重复数量对ArrayList进行排序? [关闭]

问题描述 投票:-5回答:2

在这里按顺序对ArrayList进行排序,在索引0处具有最大数量的重复项。任何人都可以帮我解决使用什么类型的循环或方法?

java loops
2个回答
1
投票

您可以使用Collections#frequency来获取事件,并相应地映射对象。这样,如果多次遇到同一个对象,它将不会被存储多次:

    // Map to store in
    HashMap<Integer, Object> map = new HashMap<Integer, Object>();
    // Iterate
    for (Object obj : list) {
        // Map according to occurrences
        map.put(Collections.frequency(list, obj), obj);
    }

如果要按升序访问内容,可以流式传输密钥集并对其进行排序:

map.keySet().stream().sorted().forEach(k -> System.out.println(map.get(k) + ":" + k));

如果要按降序访问内容,可以使用与Integer#compare相反的make比较器:

map.keySet().stream().sorted((k1, k2) ->  (k1 < k2) ? 1 : ((k1 == k2) ? 0 : -1)).forEach(k -> System.out.println(map.get(k) + ":" + k));

如果您不想流式传输您的密钥集(假设您正在访问不同的行),则可以使用Iterator代替:

Iterator<Integer> descending = map.keySet().stream().sorted((k1, k2) ->  (k1 < k2) ? 1 : ((k1 == k2) ? 0 : -1)).iterator();
Iterator<Integer> ascending = map.keySet().stream().sorted().iterator();

while(descending.hasNext()) {
    int i = descending.next();
    System.out.println(map.get(i) + ":" + i);
}
while(ascending.hasNext()) {
    int i = ascending.next();
    System.out.println(map.get(i) + ":" + i);
}

0
投票

你可以按步骤完成:

  • 计算每个元素的频率
  • 每个元素使用它们的频率进行比较(地图)
List<Integer> list = Arrays.asList(9, 8, 7, 6, 5, 4, 3, 2, 1, 4, 5, 6, 7, 8, 9, 7, 8, 9);
Map<Integer, Long> couterMap = list.stream().collect(
                        Collectors.groupingBy(Function.identity(), Collectors.counting()));

System.out.println(list);
list.sort(Comparator.comparingLong(couterMap::get));
// details : list.sort((o, p) -> Long.compare(couterMap.get(o), couterMap.get(p)));
System.out.println(list);

你得到

[9, 8, 7, 6, 5, 4, 3, 2, 1, 4, 5, 6, 7, 8, 9, 7, 8, 9]
[3, 2, 1, 6, 5, 4, 4, 5, 6, 9, 8, 7, 7, 8, 9, 7, 8, 9]

那些只出现一次(1,2,3)然后出现两次(4,5,6),蚂蚁然后出现3次(7,8,9


获得[1, 2, 3, 4, 4, 5, 5, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9]

使用:list.sort(Comparator.comparingLong(couterMap::get).thenComparingInt(Integer.class::cast));

© www.soinside.com 2019 - 2024. All rights reserved.