合并 2 个映射,键作为第二个映射的值
Merge 2 maps with keys as values of second map
我有 2 个地图定义为 Map<String, Set<String>>
:
map1 : {
Honda=[Accord, Civic, CRV],
Toyota=[Corola, RAV4, Yaris]
}
map2 : {
Accord=[5w30, 10w40],
Civic=[0w30, 5w30, 5w40],
CRV=[5w30, 5w40, 10w40],
Corola=[0w30, 10w40],
RAV4=[0w20, 0w30, 5w30]
}
我需要合并这 2 个地图,这样结果地图键将是品牌名称(例如本田、丰田),值将是所有机油。有些像这样:
mergeMap: {
Honda=[0w30, 5w30, 5w40, 10w40],
Toyota=[0w20, 0w30, 5w30, 10w40]
}
我写了 sam old school 方法,它使用 forEach
块,但我认为使用流等会更好。可能吗?如果是,如何?
由于生成的地图将具有相同的键,您可以使用 mapValues
。
在 lambda 中,flatMap
值中的每个字符串设置为第二个映射中的相应值(如果存在)。
map1.mapValues { (_, v) -> v.flatMap { map2[it] ?: emptyList() }.toSortedSet() }
这给了你 Map<String, SortedSet<String>>
.
请注意,这将按字典顺序对“0w30”字符串进行排序,因为它们是字符串,因此您不会得到您想要的确切顺序。我不知道这些字符串代表什么,但您可能应该用实现 Comparable
的数据 class 来表示它们。那会给你正确的顺序。
我有 2 个地图定义为 Map<String, Set<String>>
:
map1 : {
Honda=[Accord, Civic, CRV],
Toyota=[Corola, RAV4, Yaris]
}
map2 : {
Accord=[5w30, 10w40],
Civic=[0w30, 5w30, 5w40],
CRV=[5w30, 5w40, 10w40],
Corola=[0w30, 10w40],
RAV4=[0w20, 0w30, 5w30]
}
我需要合并这 2 个地图,这样结果地图键将是品牌名称(例如本田、丰田),值将是所有机油。有些像这样:
mergeMap: {
Honda=[0w30, 5w30, 5w40, 10w40],
Toyota=[0w20, 0w30, 5w30, 10w40]
}
我写了 sam old school 方法,它使用 forEach
块,但我认为使用流等会更好。可能吗?如果是,如何?
由于生成的地图将具有相同的键,您可以使用 mapValues
。
在 lambda 中,flatMap
值中的每个字符串设置为第二个映射中的相应值(如果存在)。
map1.mapValues { (_, v) -> v.flatMap { map2[it] ?: emptyList() }.toSortedSet() }
这给了你 Map<String, SortedSet<String>>
.
请注意,这将按字典顺序对“0w30”字符串进行排序,因为它们是字符串,因此您不会得到您想要的确切顺序。我不知道这些字符串代表什么,但您可能应该用实现 Comparable
的数据 class 来表示它们。那会给你正确的顺序。