如何找到 List<TreeMap<Integer,Integer>> 中特定键的最大值?
How to find the Maximum value for specific key in List<TreeMap<Integer,Integer>>?
你能帮我从地图列表中找到每个键的最大值吗:
地图列表如下:
[{47=96, 82=189, 100=231, 125=279, 158=322, 240=375},
{47=125, 82=239, 100=285, 125=334, 158=378, 240=429},
{47=119, 82=170, 100=182, 125=188, 158=188, 240=170}]
如何找到每个键的最大值?例如,key 47 的最大值是 125,我需要找到每个 key 的最大值。
List<TreeMap<Integer, Integer>> listOfFreq = new ArrayList<>();
for (int thisFreq : frequencyList) {
int max = listOfFreq.stream()
.mapToInt(map -> map.getOrDefault(thisFreq, Integer.MIN_VALUE))
.max().orElse(0);
您可以使用 flatMap
展平 map 的 entrySet 并使用 Collectors.toMap
将最大值作为键值收集为新的 map。
Map<Integer, Integer> res =
listOfFreq.stream()
.flatMap(m -> m.entrySet().stream())
.collect(Collectors.toMap(e -> e.getKey(), e -> e.getValue(), Integer::max));
您可以使用 Collectors.groupingBy(classifier,downstream)
方法来达到此目的:
List<Map<Integer, Integer>> listOfFreq = List.of(
// k1, v1, k2, v2, k3, v3, k4, v4, k5, v5, k6, v6
Map.of(47, 96, 82, 189, 100, 231, 125, 279, 158, 322, 240, 375),
Map.of(47, 125, 82, 239, 100, 285, 125, 334, 158, 378, 240, 429),
Map.of(47, 119, 82, 170, 100, 182, 125, 188, 158, 188, 240, 170));
Map<Integer, Integer> mapOfMaxFreq = listOfFreq
// Stream<Map<Integer,Integer>>
.stream()
// Stream<Set<Map.Entry<Integer,Integer>>>
.map(Map::entrySet)
// stream over all entries of all maps
// Stream<Map.Entry<Integer,Integer>>
.flatMap(Set::stream)
// looking for a max value for each key in
// all map entries and collect them to map
// Map<Integer,Optional<Map.Entry<Integer,Integer>>>
.collect(Collectors.groupingBy(
Map.Entry::getKey,
Collectors.maxBy(Comparator.comparingInt(Map.Entry::getValue))))
// Collection<Optional<Map.Entry<Integer,Integer>>>
.values()
// Stream<Optional<Map.Entry<Integer,Integer>>>
.stream()
// get value if present or else (0, 0)
// Stream<Map.Entry<Integer,Integer>>
.map(entry -> entry.orElse(Map.entry(0, 0)))
// collect to map
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
System.out.println(mapOfMaxFreq);
// {240=429, 82=239, 100=285, 125=334, 158=378, 47=125}
你能帮我从地图列表中找到每个键的最大值吗: 地图列表如下:
[{47=96, 82=189, 100=231, 125=279, 158=322, 240=375},
{47=125, 82=239, 100=285, 125=334, 158=378, 240=429},
{47=119, 82=170, 100=182, 125=188, 158=188, 240=170}]
如何找到每个键的最大值?例如,key 47 的最大值是 125,我需要找到每个 key 的最大值。
List<TreeMap<Integer, Integer>> listOfFreq = new ArrayList<>();
for (int thisFreq : frequencyList) {
int max = listOfFreq.stream()
.mapToInt(map -> map.getOrDefault(thisFreq, Integer.MIN_VALUE))
.max().orElse(0);
您可以使用 flatMap
展平 map 的 entrySet 并使用 Collectors.toMap
将最大值作为键值收集为新的 map。
Map<Integer, Integer> res =
listOfFreq.stream()
.flatMap(m -> m.entrySet().stream())
.collect(Collectors.toMap(e -> e.getKey(), e -> e.getValue(), Integer::max));
您可以使用 Collectors.groupingBy(classifier,downstream)
方法来达到此目的:
List<Map<Integer, Integer>> listOfFreq = List.of(
// k1, v1, k2, v2, k3, v3, k4, v4, k5, v5, k6, v6
Map.of(47, 96, 82, 189, 100, 231, 125, 279, 158, 322, 240, 375),
Map.of(47, 125, 82, 239, 100, 285, 125, 334, 158, 378, 240, 429),
Map.of(47, 119, 82, 170, 100, 182, 125, 188, 158, 188, 240, 170));
Map<Integer, Integer> mapOfMaxFreq = listOfFreq
// Stream<Map<Integer,Integer>>
.stream()
// Stream<Set<Map.Entry<Integer,Integer>>>
.map(Map::entrySet)
// stream over all entries of all maps
// Stream<Map.Entry<Integer,Integer>>
.flatMap(Set::stream)
// looking for a max value for each key in
// all map entries and collect them to map
// Map<Integer,Optional<Map.Entry<Integer,Integer>>>
.collect(Collectors.groupingBy(
Map.Entry::getKey,
Collectors.maxBy(Comparator.comparingInt(Map.Entry::getValue))))
// Collection<Optional<Map.Entry<Integer,Integer>>>
.values()
// Stream<Optional<Map.Entry<Integer,Integer>>>
.stream()
// get value if present or else (0, 0)
// Stream<Map.Entry<Integer,Integer>>
.map(entry -> entry.orElse(Map.entry(0, 0)))
// collect to map
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
System.out.println(mapOfMaxFreq);
// {240=429, 82=239, 100=285, 125=334, 158=378, 47=125}