我有一个整数数组,我想知道哪个数字比其他数字重复得多。如果我们有两个重复相同的数字,我的程序应该返回带有min索引的数字。
例如:我有一个保存在num以下的数组列表。
ArrayList<Integer> list = new ArrayList<>();
list.add(9);
list.add(0);
list.add(1);
list.add(1);
list.add(9);
所以我创建了Hashmap来将数字保存为键,并将其频率保存为Value
HashMap<Integer, Integer> list1 = new HashMap<>();
for (int i = 0; i < list.size(); i++) {
list1.put(list.get(i), Collections.frequency(list, list.get(i)));
}
由于我有两个数字“ 1,9”,彼此重复相同的次数“ 2次” 我的程序应返回1,因为其中一个索引为最小值。 那么如何在哈希图中查找最大值并返回最小值索引
答案 0 :(得分:1)
我建议使用groupingBy
而不是frequency
收集器,然后利用流API进一步应用操作来优化查询。
Optional<Integer> key = list.stream() // Stream<Integer>
.collect(groupingBy(Function.identity(), counting())) // Map<Integer, Long>
.entrySet().stream() //Stream<Entry<Integer, Long>>
.max(Comparator.comparingLong((ToLongFunction<Map.Entry<Integer, Long>>) Map.Entry::getValue)
.thenComparingInt(s -> -s.getKey())) // Optional<Entry<Integer, Long>> // Optional<Entry<Integer, Long>>
.map(Map.Entry::getKey); //Optional<Integer>
groupingBy
收集器提供给collect
方法使我们可以对源list
中的每个元素进行分组,结果得到一个Map<Integer, Long>
,其中每个条目代表该元素以及它在源list
中发生的次数。Optional<Integer>
,其中包含键,否则为空的可选键。 针对您提供的示例数据运行此代码,这将检索符合您要求的数字1
。
由于您提到列表中的数字代表索引,因此就足够了。
如果您不熟悉Optional<T>
API,则建议浏览文档here。
答案 1 :(得分:0)
您需要使用LinkedHashMap
来维护Map
中的插入顺序,然后可以使用lambda索引具有最大值的索引,如下所示:
List<Integer> list = new ArrayList<>();
list.add(9);
list.add(0);
list.add(1);
list.add(1);
list.add(9);
Map<Integer, Integer> map = new LinkedHashMap<>();
for (int i = 0; i < list.size(); i++) {
map.put(list.get(i), Collections.frequency(list, list.get(i)));
}
System.out.println(map);
System.out.println(Collections.max(map.entrySet(),
Comparator.comparingInt(entry -> entry.getValue())).getKey());
O / P:
{9 = 2,0 = 1,1 = 2}
9
如果您要使用最小键进行索引,则将LinkedHashMap
上方的内容替换为以下内容:
SortedMap<Integer, Integer> map = new TreeMap<>();
它将提供1
作为输出。