在这里按顺序对ArrayList进行排序,在索引0处具有最大数量的重复项。任何人都可以帮我解决使用什么类型的循环或方法?
您可以使用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);
}
你可以按步骤完成:
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));