基于重复数量对ArrayList进行排序?

时间:2017-12-20 21:28:25

标签: java loops

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

2 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分: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));