向地图中的列表添加项目的 Kotlin 惯用方法
Kotlin-idiomatic way to add an item to a list in a map
我有一个 MutableMap<String, MutableList<String>
我正在添加项目,基本上是一个集合,其中相同的键与多个值相关联。
每当我想添加一个新值时,我需要先检查是否已经有一个列表关联到同一个键,如果没有则初始化一个,然后将值添加到列表中。
我可以通过
以非常冗长的方式做到这一点
if (map.containsKey(key)) {
map[key].add(value)
} else {
map[key] = mutableListOf(value)
}
我也可以通过以下方式以非常简洁的方式做到这一点
map[key] = (map[key] ?: mutableListOf()) + mutableListOf(value)).toMutableList()
以及在冗长与简洁之间的其他几种方式。
在 Kotlin 中执行此操作的惯用方法是什么?
我的目标不是简洁,而是一种可以立即识别和理解的形式。
您可以使用getOrPut
map.getOrPut(key) { mutableListOf() }.add(value)
创建一个扩展函数(将其命名为“可以立即识别和理解”):
fun MutableMap<String, MutableList<String>>.addValue(key: String, value: String) {
if (containsKey(key)) {
this[key]?.add(value)
} else {
this[key] = mutableListOf(value)
}
}
在需要的地方使用扩展功能:
map.addValue(key, value)
我不得不想到 Python,因为它提供了一个 defaultdict
,可以像这样使用:
from collections import defaultdict
data = [('red', 1), ('blue', 2), ('red', 3), ('blue', 4), ('red', 1), ('blue', 5)]
d = defaultdict(set)
for k, v in data:
d[k].add(v)
print(d.items()) # dict_items([('red', {1, 3}), ('blue', {2, 4, 5})])
有趣的是,Kotlin 也带有类似 built-in 的东西,即 withDefault
扩展:
val data = listOf("red" to 1, "blue" to 2, "red" to 3, "blue" to 4, "red" to 1, "blue" to 5)
val map = mutableMapOf<String, Set<Int>>().withDefault { emptySet() }
for (d in data) {
map[d.first] = (map.getValue(d.first) + d.second)
}
我有一个 MutableMap<String, MutableList<String>
我正在添加项目,基本上是一个集合,其中相同的键与多个值相关联。
每当我想添加一个新值时,我需要先检查是否已经有一个列表关联到同一个键,如果没有则初始化一个,然后将值添加到列表中。
我可以通过
以非常冗长的方式做到这一点if (map.containsKey(key)) {
map[key].add(value)
} else {
map[key] = mutableListOf(value)
}
我也可以通过以下方式以非常简洁的方式做到这一点
map[key] = (map[key] ?: mutableListOf()) + mutableListOf(value)).toMutableList()
以及在冗长与简洁之间的其他几种方式。
在 Kotlin 中执行此操作的惯用方法是什么?
我的目标不是简洁,而是一种可以立即识别和理解的形式。
您可以使用getOrPut
map.getOrPut(key) { mutableListOf() }.add(value)
创建一个扩展函数(将其命名为“可以立即识别和理解”):
fun MutableMap<String, MutableList<String>>.addValue(key: String, value: String) {
if (containsKey(key)) {
this[key]?.add(value)
} else {
this[key] = mutableListOf(value)
}
}
在需要的地方使用扩展功能:
map.addValue(key, value)
我不得不想到 Python,因为它提供了一个 defaultdict
,可以像这样使用:
from collections import defaultdict
data = [('red', 1), ('blue', 2), ('red', 3), ('blue', 4), ('red', 1), ('blue', 5)]
d = defaultdict(set)
for k, v in data:
d[k].add(v)
print(d.items()) # dict_items([('red', {1, 3}), ('blue', {2, 4, 5})])
有趣的是,Kotlin 也带有类似 built-in 的东西,即 withDefault
扩展:
val data = listOf("red" to 1, "blue" to 2, "red" to 3, "blue" to 4, "red" to 1, "blue" to 5)
val map = mutableMapOf<String, Set<Int>>().withDefault { emptySet() }
for (d in data) {
map[d.first] = (map.getValue(d.first) + d.second)
}