如何通过将其值转换为键来展平 Map
How to flatten a Map by turning its values into keys
如何根据分组为键的值将 Map<String, List<String>>
转换为扁平化地图。
即从 Map<String, List<String>>
到 Map<String, String>
(按值压平)
举个例子。
来源图:
<"fuel", ["BMW", "Honda"]>,
<"electric", ["Tesla", "Nio"]>
扁平化地图:
[
"BMW" : "fuel",
"Honda" : "fuel",
"Tesla" : "electric",
"Nio" : "electric"
]
根据 equals/hashCode
在同一地图中不可能有 多个键 相同,因为它与 map[= 的想法相矛盾67=] 数据结构。每个键都必须是唯一的,您不能在 Map
.
中使用 相同的键 存储多个条目
但是您可以创建一个包含 Map.Entry
个对象的 列表。
为此,您需要在 条目集 上创建一个流,然后通过创建一个 flatten 每个条目]新条目基于汽车品牌(扁平值的元素)每个key:
Map<String, List<String>> cars =
Map.of("fuel", List.of("BMW", "Honda"),
"electric", List.of("Tesla", "Nio"));
List<Map.Entry<String, String>> entries =
cars.entrySet().stream()
.flatMap(entry -> entry.getValue().stream()
.map(brand -> Map.entry(entry.getKey(), brand)))
.collect(Collectors.toList());
System.out.println(entries);
输出
[electric=Tesla, electric=Nio, fuel=BMW, fuel=Honda]
或者您的意图可能是创建一个 Map<String, String>
,允许根据 品牌 检索 汽车类型(例如那: "BMW" : "fuel", "Honda" : "fuel") 那么它就有意义了。
总体方法与上一个类似:
- 在 条目集上创建流;
- 通过将 value-list 中的一个元素变成 新条目 使用
flatMap()
展平 每个条目;
- 使用
Collectors.toMap()
. 将元素收集到 map
但是有一个 警告:所有值都必须是唯一的,或者必须有关于如何 combine/discarde 的规则车型。
我会假设地图中的所有品牌都是唯一的,否则,下面的代码将失败(处理碰撞 Collectors.toMap()
需要第三个参数 - mergeFunction
).
Map<String, String> typeByBrand =
cars.entrySet().stream()
.flatMap(entry -> entry.getValue().stream()
.map(brand -> Map.entry(brand, entry.getKey())))
.collect(Collectors.toMap(Map.Entry::getKey,
Map.Entry::getValue));
System.out.println(typeByBrand);
输出
{Nio=electric, Tesla=electric, BMW=fuel, Honda=fuel}
如何根据分组为键的值将 Map<String, List<String>>
转换为扁平化地图。
即从 Map<String, List<String>>
到 Map<String, String>
(按值压平)
举个例子。
来源图:
<"fuel", ["BMW", "Honda"]>,
<"electric", ["Tesla", "Nio"]>
扁平化地图:
[
"BMW" : "fuel",
"Honda" : "fuel",
"Tesla" : "electric",
"Nio" : "electric"
]
根据 equals/hashCode
在同一地图中不可能有 多个键 相同,因为它与 map[= 的想法相矛盾67=] 数据结构。每个键都必须是唯一的,您不能在 Map
.
但是您可以创建一个包含 Map.Entry
个对象的 列表。
为此,您需要在 条目集 上创建一个流,然后通过创建一个 flatten 每个条目]新条目基于汽车品牌(扁平值的元素)每个key:
Map<String, List<String>> cars =
Map.of("fuel", List.of("BMW", "Honda"),
"electric", List.of("Tesla", "Nio"));
List<Map.Entry<String, String>> entries =
cars.entrySet().stream()
.flatMap(entry -> entry.getValue().stream()
.map(brand -> Map.entry(entry.getKey(), brand)))
.collect(Collectors.toList());
System.out.println(entries);
输出
[electric=Tesla, electric=Nio, fuel=BMW, fuel=Honda]
或者您的意图可能是创建一个 Map<String, String>
,允许根据 品牌 检索 汽车类型(例如那: "BMW" : "fuel", "Honda" : "fuel") 那么它就有意义了。
总体方法与上一个类似:
- 在 条目集上创建流;
- 通过将 value-list 中的一个元素变成 新条目 使用
flatMap()
展平 每个条目; - 使用
Collectors.toMap()
. 将元素收集到 map
但是有一个 警告:所有值都必须是唯一的,或者必须有关于如何 combine/discarde 的规则车型。
我会假设地图中的所有品牌都是唯一的,否则,下面的代码将失败(处理碰撞 Collectors.toMap()
需要第三个参数 - mergeFunction
).
Map<String, String> typeByBrand =
cars.entrySet().stream()
.flatMap(entry -> entry.getValue().stream()
.map(brand -> Map.entry(brand, entry.getKey())))
.collect(Collectors.toMap(Map.Entry::getKey,
Map.Entry::getValue));
System.out.println(typeByBrand);
输出
{Nio=electric, Tesla=electric, BMW=fuel, Honda=fuel}