java通过stream生成Map<string,list<int>>
时间: 2024-11-04 12:13:49 浏览: 9
在Java中,可以使用Stream API来轻松地从列表或其他数据结构生成`Map<String, List<Integer>>`。假设你有一个包含字符串键和整数元素的列表,你可以这样操作:
```java
List<String> keys = Arrays.asList("Key1", "Key2", "Key3");
List<Integer> values = Arrays.asList(1, 2, 3, 4, 5);
Map<String, List<Integer>> map = keys.stream()
.collect(Collectors.groupingBy(key -> key,
Collectors.mapping(value -> value, Collectors.toList())));
```
这里,`Collectors.groupingBy()`方法用于根据键值创建分组,然后`Collectors.mapping()`方法用于将每个键对应的原始列表元素应用到结果列表上。这会生成一个`Map`,其中每个键关联一个包含对应值的列表。
相关问题
Java dict String ,List<String> 转换 dict <String , int> stream int 是List<String> size
在Java中,如果你有一个字典(Map)类型`Map<String, List<String>>`,并且你想将其转换成另一个键值对形式的`Map<String, Integer>`,其中键不变,值是对应列表的大小,你可以通过流(Stream)操作来完成。下面是一个示例:
```java
import java.util.*;
import java.util.stream.Collectors;
// 假设你有如下的map
Map<String, List<String>> stringListDict = new HashMap<>();
stringListDict.put("key1", Arrays.asList("val1a", "val1b"));
stringListDict.put("key2", Arrays.asList("val2a"));
// 使用stream转换
Map<String, Integer> intDict = stringListDict.entrySet().stream()
.collect(Collectors.toMap(
Map.Entry::getKey,
entry -> entry.getValue().size()));
System.out.println(intDict); // 输出:{key1=2, key2=1}
Map<String, List<>>转List<List<>>且均匀分配
假设你的 `Map<String, List<?>>` 是这样的:
```java
Map<String, List<?>> map = new HashMap<>();
map.put("key1", Arrays.asList("a", "b", "c"));
map.put("key2", Arrays.asList(1, 2, 3, 4));
map.put("key3", Arrays.asList(true, false));
```
如果你想把这个 Map 转成一个 List<List<?>>,并且希望每个 List<?> 都具有相同的大小,可以按照以下步骤进行:
1. 计算每个 List<?> 应该具有的大小。
```java
int totalSize = map.values().stream()
.mapToInt(List::size)
.sum();
int subListSize = (int) Math.ceil((double) totalSize / map.size());
```
`totalSize` 计算了所有 List<?> 的总大小,`subListSize` 则是每个 List<?> 应该具有的大小。使用 `Math.ceil()` 取整能够确保每个 List<?> 的大小都不小于 `subListSize`。
2. 将 Map 转成一个 List<List<?>>。
```java
List<List<?>> result = new ArrayList<>();
map.values().forEach(list -> {
for (int i = 0; i < list.size(); i += subListSize) {
result.add(list.subList(i, Math.min(i + subListSize, list.size())));
}
});
```
这里使用了两个循环。外层循环遍历 Map 中的每个 List<?>;内层循环则将每个 List<?> 按照 `subListSize` 进行分割,将得到的子列表添加到 `result` 中。
最终,`result` 中的每个元素都是一个具有相同大小的 List<?>。完整代码如下:
```java
Map<String, List<?>> map = new HashMap<>();
map.put("key1", Arrays.asList("a", "b", "c"));
map.put("key2", Arrays.asList(1, 2, 3, 4));
map.put("key3", Arrays.asList(true, false));
int totalSize = map.values().stream()
.mapToInt(List::size)
.sum();
int subListSize = (int) Math.ceil((double) totalSize / map.size());
List<List<?>> result = new ArrayList<>();
map.values().forEach(list -> {
for (int i = 0; i < list.size(); i += subListSize) {
result.add(list.subList(i, Math.min(i + subListSize, list.size())));
}
});
System.out.println(result); // [[a, b], [c, 1, 2], [3, 4, true], [false]]
```
阅读全文