Java - 查找具有最大大小的哈希表

时间:2016-12-19 10:04:51

标签: java java-8 java-stream

我有以下数据结构:

Map<Integer, Map<String,Double>>

----------------
|     | a    2 |
| 100 | b    1 |    
|     | c    2 |
----------------
|     | a    2 |
| 101 | c    2 |    
----------------
|     | a    2 |
| 102 | b    1 |    
|     | c    2 |
----------------

目标:获取包含内部地图的外部地图的ID,其中包含最大尺寸。

例如100102,它们都包含尺寸为3的内部地图。

我如何使用Stream API,例如?

3 个答案:

答案 0 :(得分:5)

要获取具有最大地图值的任何条目的外部地图的键,代码可以是:

int id = map.entrySet()
    .stream()
    .max(Map.Entry.comparingByValue(Comparator.comparingInt(Map::size)))
    .get() // May throw a NoSuchElementException if there is no max
    .getKey();

另一种方法允许@Holger提出的值为Optional<Integer>,以避免在地图为空时我们没有最大值时获得NoSuchElementException

Optional<Integer> id = map.entrySet()
    .stream()
    .max(Map.Entry.comparingByValue(Comparator.comparingInt(Map::size)))
    .map(Map.Entry::getKey);

请注意,这些方法比通过密钥并调用map.get(k).size()以获取内部地图的大小更有效,因为您执行了不必要的地图查找,而不是在迭代时执行直接按照这些方法提出的条目。

答案 1 :(得分:4)

map.values().stream().max(Comparator.comparingInt(Map::size)).get()

是您正在寻找的。

map.keySet().stream().max(Comparator.comparingInt(k -> map.get(k).size()))

或以上如果你想要钥匙,而不是地图。 测试代码:

Map<Integer, Map<String, Integer>> map = new HashMap<>();
        Map<String, Integer> map2 = new HashMap<>();
        map2.put("A", 1);
        map2.put("B", 2);
        map2.put("C", 3);
        map.put(100, map2);
        map2 = new HashMap<>();
        map2.put("A", 1);
        map2.put("B", 2);
        map.put(101, map2);
        System.out.println(map.values()
                              .stream()
                              .max(Comparator.comparingInt(Map::size)).get());

答案 2 :(得分:4)

这应该输出100或具有最大元素的键。

map.keySet().stream().max((v1, v2) -> {
                return Integer.compare(map.get(v1).size(), map.get(v2).size());
            })

或使用比较器

map.keySet().stream().max(Comparator.comparingInt(v -> map.get(v).size()))

完整代码:

Map<Integer,Map<String,Double>> map = new HashMap<>();
Map<String,Double> map100 = new HashMap<>();
map100.put("a", 2.0);
map100.put("b", 1.0);
map100.put("c", 2.0);
Map<String,Double> map101 = new HashMap<>();
map101.put("a", 2.0);
map101.put("b", 1.0);
Map<String,Double> map102 = new HashMap<>();
map102.put("a", 2.0);
map102.put("b", 1.0);
map102.put("c", 2.0);
map102.put("d", 2.0);
map.put(100, map100);
map.put(101, map101);
map.put(102, map102);

System.out.println(map.keySet().stream().max(Comparator.comparingInt(v -> map.get(v).size())));

System.out.println(map.keySet().stream().max((v1, v2) -> {
    return Integer.compare(map.get(v1).size(), map.get(v2).size());
}));