Map<String, List<>>转List<List<>>且每个key的值不连续分配
时间: 2023-11-11 17:39:57 浏览: 33
假设你的Map的键类型为String,值类型为List,可以按照以下步骤将其转换为List<List>:
1. 获取Map的值集合,即List<List> values = new ArrayList<>(map.values())。
2. 创建一个新的List<List>,即List<List> result = new ArrayList<>()。
3. 遍历值集合,对于每个值List,将其添加到result中。
4. 如果值集合中有任何空列表,您可能需要在步骤3中跳过它们。
关于每个key的值不连续分配的问题,我不太明白您的意思。如果您希望将Map的值转换为List<List>时按照键的顺序进行分配,您可以使用LinkedHashMap而不是普通的HashMap。LinkedHashMap保留了元素的插入顺序,因此当您遍历Map的值时,它们将按照键的顺序排列。
相关问题
Map<String,List<String>>转 Map<String,String>
可以通过遍历Map<String,List<String>>,将List<String>转化为String,然后将其放入新的Map<String,String>中。具体实现如下所示:
```java
Map<String, List<String>> map1 = new HashMap<>();
Map<String, String> map2 = new HashMap<>();
for (Map.Entry<String, List<String>> entry : map1.entrySet()) {
String key = entry.getKey();
List<String> valueList = entry.getValue();
StringBuilder sb = new StringBuilder();
for (String value : valueList) {
sb.append(value);
}
map2.put(key, sb.toString());
}
```
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]]
```