在Hashmap中找到最大值并返回最小键

时间:2019-01-01 12:50:15

标签: java hashmap

我有一个整数数组,我想知道哪个数字比其他数字重复得多。如果我们有两个重复相同的数字,我的程序应该返回带有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,因为其中一个索引为最小值。 那么如何在哈希图中查找最大值并返回最小值索引

2 个答案:

答案 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中发生的次数。
  • 然后我们在Hashmap中找到最大值并返回最小键。
  • 最后,我们有一个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作为输出。