我有以下数据结构:
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,其中包含最大尺寸。
例如100
或102
,它们都包含尺寸为3的内部地图。
我如何使用Stream API
,例如?
答案 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()
是您正在寻找的。 p>
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());
}));