Map<String, List<>>转List<List<>>且均匀分配
时间: 2023-10-14 22:21:00 浏览: 94
map转化为list
5星 · 资源好评率100%
假设你的 `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]]
```
阅读全文