有誰知道如何在 Kotlin 中將 List<Pair<K, Collection< V >>> 轉換為 Map<K,Collection< V >>,合并與同一鍵關聯的集合?
在Java中,我會使用類似的東西:
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (c1, c2) -> {
List result = new ArrayList<>();
result.addAll(c1);
result.addAll(c2);
return result;
})
Kotlin 有類似的設備還是更好的設備?任何建議表示贊賞。
uj5u.com熱心網友回復:
僅供參考,在不需要合并重復鍵的值的情況下,Kotlin 有一個toMap函式。
但是,如果要合并,則必須稍微復雜一些。假設你有一個這樣的對串列:
val pairs = listOf(
1 to listOf("1", "2", "3"),
1 to listOf("4"),
2 to listOf("1", "2", "3"),
3 to listOf("1", "2", "3"),
3 to listOf("4", "5", "6"),
)
您可以像這樣使用groupBy和mapValues:
val map = pairs.groupBy({ it.first }, { it.second })
.mapValues { (k, v) -> v.flatten() }
將groupBy創建一個Map<Int, List<List<String>>>,因此每個鍵都將映射到與其對應的所有值的串列。然后mapValues展平每個串列串列,使其成為單個串列。
請注意,這會創建一個中間映射,并且與提供的 Java 相比,在性能敏感的代碼中可能效率不高。如果你需要效率,你可以使用groupingBy來獲得更懶惰的分組并隨意聚合。例如:
val map = pairs.groupingBy { it.first }
.fold(emptyList<String>()) { acc, v -> acc v.second }
這很好,但在合并時會創建中間串列。或者:
val map = pairs.groupingBy { it.first }.fold(
initialValueSelector = { _, _ -> mutableListOf<String>() },
operation = { _, acc, v -> acc.addAll(v.second); acc }
)
它為每個鍵創建一個串列,但有點復雜。或者,如果您想變得更瘋狂,則可以使用另一種變體:
val map = pairs.groupingBy { it.first }.aggregate { k, acc: List<String>?, v, _ ->
if (acc == null) v.second else acc v.second
}
(誠??然,這有點拗口,仍然會創建中間串列)
uj5u.com熱心網友回復:
你可以用associate它來隱藏它。例如:
listOf(
Pair(1, listOf("1", "2", "3")),
Pair(2, listOf("1", "2", "3")),
Pair(3, listOf("1", "2", "3"))
).associate { it.first to it.second }
結果是地圖:
{1=[1, 2, 3], 2=[1, 2, 3], 3=[1, 2, 3]}
如果您只需要第一個元素作為值,則只需將值映射修改為it.second.first().
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/529183.html
