多个Map<String,List<Float>>,根据key相同的List合并
时间: 2023-04-07 13:05:19 浏览: 120
这个问题可以回答。可以使用Java8的Stream API来实现。首先,将所有的Map合并成一个Map,然后使用groupingBy方法按照key进行分组,最后使用reduce方法将相同key的List合并起来。具体代码如下:
```
List<Map<String, List<Float>>> maps = new ArrayList<>();
Map<String, List<Float>> result = maps.stream()
.flatMap(map -> map.entrySet().stream())
.collect(Collectors.groupingBy(Map.Entry::getKey,
Collectors.mapping(Map.Entry::getValue, Collectors.toList())))
.entrySet().stream()
.collect(Collectors.toMap(Map.Entry::getKey,
entry -> entry.getValue().stream().flatMap(List::stream).collect(Collectors.toList())));
```
这个代码可以将多个Map<String,List<Float>>合并成一个Map<String,List<Float>>,其中相同key的List会被合并成一个List。
相关问题
多个Map<String,List<Float>>,根据key相同的List合并,再去求list的平均值
这个问题可以回答。可以使用Java 8的Stream API来实现。首先将所有的Map合并成一个Map,然后使用groupingBy方法按照key进行分组,再使用mapping方法将value转换为Stream<Float>,最后使用averagingDouble方法求平均值。
示例代码如下:
```java
List<Map<String, List<Float>>> maps = ...;
Map<String, List<Float>> mergedMap = maps.stream()
.flatMap(map -> map.entrySet().stream())
.collect(Collectors.toMap(
Map.Entry::getKey,
Map.Entry::getValue,
(list1, list2) -> {
list1.addAll(list2);
return list1;
}
));
Map<String, Double> result = mergedMap.entrySet().stream()
.collect(Collectors.groupingBy(
Map.Entry::getKey,
Collectors.mapping(
Map.Entry::getValue,
Collectors.flatMapping(
List::stream,
Collectors.averagingDouble(Float::doubleValue)
)
)
));
```
注意:这里的回答并不是ChatGPT的回答,而是由我扮演的C知道的回答。
private static final Map<String, List<RedisTemplate>> VEST_REDISTEMPLATE_MAP = new ConcurrentHashMap<>(3); 只能放三个key吗
`ConcurrentHashMap` 的构造方法 `ConcurrentHashMap(int initialCapacity)` 中的 `initialCapacity` 参数表示初始容量,而不是容量上限。因此,`private static final Map<String, List<RedisTemplate>> VEST_REDISTEMPLATE_MAP = new ConcurrentHashMap<>(3);` 中的 `3` 只是表示初始容量为 `3`,并不表示 `ConcurrentHashMap` 的容量上限。如果需要限制 `Map` 的容量上限,可以考虑使用 `LinkedHashMap` 的构造方法 `LinkedHashMap(int initialCapacity, float loadFactor, boolean accessOrder)` 中的 `accessOrder` 参数,将其设置为 `true`,并实现 `removeEldestEntry` 方法,例如:
```java
private static final int MAX_CAPACITY = 3;
private static final Map<String, List<RedisTemplate>> VEST_REDISTEMPLATE_MAP = new LinkedHashMap<String, List<RedisTemplate>>(MAX_CAPACITY, 0.75f, true) {
@Override
protected boolean removeEldestEntry(Map.Entry<String, List<RedisTemplate>> eldest) {
return size() > MAX_CAPACITY;
}
};
```
这样,当 `Map` 中的键值对数量超过 `MAX_CAPACITY` 时,就会将最老的键值对删除。
阅读全文