将映射字符串字符串转换为映射字符串列表字符串 - Java 7
convert map string string to map string list string - Java 7
我有一个字符串 string(List<Map<String,String>>
) 的映射列表,如下所示,
[{key = "car", value = "bmw"},{key = "car", value = "suzuki"},{key = "car", value = "hyundai"},{key = "bike", value = "honda"},{key = "bike", value = "tvs"}]
我想转换为下面的地图字符串列表字符串列表 (List<Map<String, List<String>>>
) 或类似的东西
[{key = "car", value = ["bmw","suzuki","hyundai"]},{key = "bike", value = ["honda","tvs"]}]
提前致谢。
Java8+
对于单例映射
使用groupingBy键分离然后映射得到你的单例映射的值
Map<String, List<String>> res =
list.stream()
.map(map -> map.entrySet().iterator().next())
.collect(Collectors.groupingBy(
entry -> entry.getKey(),
Collectors.mapping(
entry -> entry.getValue(),
Collectors.toList()
)
)
);
对于具有多个条目的地图
你做的和上面一样,但是 flatMap 获取单个一维流中的所有条目
Map<String, List<String>> res =
list.stream()
.flatMap(map -> map.entrySet().stream())
.collect(Collectors.groupingBy(
entry -> entry.getKey(),
Collectors.mapping(
entry -> entry.getValue(),
Collectors.toList()
)
)
);
前Java8
对于具有多个条目的地图
您必须遍历列表中的每个地图,然后遍历每个地图的条目。对于每个条目,检查键是否已经存在,如果存在,则将值添加到与该键关联的列表中。如果键不在结果映射中,则在那里创建一个新列表。
Map<String, List<String>> map = new HashMap<>();
for (Map<String, String> m : list) {
for (Map.Entry<String, String> e : m.entrySet()) {
String key = e.getKey();
if (!map.containsKey(key)) {
map.put(key, new ArrayList<String>());
}
map.get(key).add(e.getValue());
}
}
对于单例映射
对于原始列表中的每个映射,您找到第一个条目,然后执行与上述相同的操作:将该条目的值添加到该条目的键映射到的列表中,然后在此之前添加一个新列表如果密钥不存在,请转到地图。
Map<String, List<String>> map = new HashMap<>();
for (Map<String, String> m : list) {
Map.Entry<String, String> e = m.entrySet().iterator().next();
String key = e.getKey();
if (!map.containsKey(key)) {
map.put(key, new ArrayList<String>());
}
map.get(key).add(e.getValue());
}
根据您的示例,您有如下地图列表:
List<Map<String,String>> myListOfMaps = List.of(
Map.of("car", "bmw"),
Map.of("car", "suzuki"),
Map.of("car", "hyundai"),
Map.of("bike", "honda"),
Map.of("bike", "tvs")
);
然后您可以使用流的 groupingBy 函数来执行类似于您在下面看到的操作。
流式传输您的列表,通过在条目集上流式传输来展平流,按键对条目集进行分组,映射到值列表
Map<String,List<String>> myResultMap = myListOfMaps.stream()
.flatMap(m -> m.entrySet().stream())
.collect(Collectors.groupingBy(
Map.Entry::getKey, Collectors.mapping(Map.Entry::getValue, Collectors.toList())));
使用result/print ..
myResultMap.forEach((k,v)-> {
System.out.println(k + " : " + v);
});
// car : [bmw, suzuki, hyundai]
// bike : [honda, tvs]
我有一个字符串 string(List<Map<String,String>>
) 的映射列表,如下所示,
[{key = "car", value = "bmw"},{key = "car", value = "suzuki"},{key = "car", value = "hyundai"},{key = "bike", value = "honda"},{key = "bike", value = "tvs"}]
我想转换为下面的地图字符串列表字符串列表 (List<Map<String, List<String>>>
) 或类似的东西
[{key = "car", value = ["bmw","suzuki","hyundai"]},{key = "bike", value = ["honda","tvs"]}]
提前致谢。
Java8+
对于单例映射
使用groupingBy键分离然后映射得到你的单例映射的值
Map<String, List<String>> res =
list.stream()
.map(map -> map.entrySet().iterator().next())
.collect(Collectors.groupingBy(
entry -> entry.getKey(),
Collectors.mapping(
entry -> entry.getValue(),
Collectors.toList()
)
)
);
对于具有多个条目的地图
你做的和上面一样,但是 flatMap 获取单个一维流中的所有条目
Map<String, List<String>> res =
list.stream()
.flatMap(map -> map.entrySet().stream())
.collect(Collectors.groupingBy(
entry -> entry.getKey(),
Collectors.mapping(
entry -> entry.getValue(),
Collectors.toList()
)
)
);
前Java8
对于具有多个条目的地图
您必须遍历列表中的每个地图,然后遍历每个地图的条目。对于每个条目,检查键是否已经存在,如果存在,则将值添加到与该键关联的列表中。如果键不在结果映射中,则在那里创建一个新列表。
Map<String, List<String>> map = new HashMap<>();
for (Map<String, String> m : list) {
for (Map.Entry<String, String> e : m.entrySet()) {
String key = e.getKey();
if (!map.containsKey(key)) {
map.put(key, new ArrayList<String>());
}
map.get(key).add(e.getValue());
}
}
对于单例映射
对于原始列表中的每个映射,您找到第一个条目,然后执行与上述相同的操作:将该条目的值添加到该条目的键映射到的列表中,然后在此之前添加一个新列表如果密钥不存在,请转到地图。
Map<String, List<String>> map = new HashMap<>();
for (Map<String, String> m : list) {
Map.Entry<String, String> e = m.entrySet().iterator().next();
String key = e.getKey();
if (!map.containsKey(key)) {
map.put(key, new ArrayList<String>());
}
map.get(key).add(e.getValue());
}
根据您的示例,您有如下地图列表:
List<Map<String,String>> myListOfMaps = List.of(
Map.of("car", "bmw"),
Map.of("car", "suzuki"),
Map.of("car", "hyundai"),
Map.of("bike", "honda"),
Map.of("bike", "tvs")
);
然后您可以使用流的 groupingBy 函数来执行类似于您在下面看到的操作。
流式传输您的列表,通过在条目集上流式传输来展平流,按键对条目集进行分组,映射到值列表
Map<String,List<String>> myResultMap = myListOfMaps.stream()
.flatMap(m -> m.entrySet().stream())
.collect(Collectors.groupingBy(
Map.Entry::getKey, Collectors.mapping(Map.Entry::getValue, Collectors.toList())));
使用result/print ..
myResultMap.forEach((k,v)-> {
System.out.println(k + " : " + v);
});
// car : [bmw, suzuki, hyundai]
// bike : [honda, tvs]