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