Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dictionary 根据Kotlin中的键列表对贴图进行切片_Dictionary_Kotlin_Slice - Fatal编程技术网

Dictionary 根据Kotlin中的键列表对贴图进行切片

Dictionary 根据Kotlin中的键列表对贴图进行切片,dictionary,kotlin,slice,Dictionary,Kotlin,Slice,给你一张地图和一列钥匙 val abc = mapOf(1 to "a", 2 to "b", 3 to "c") val keys = listOf(1, 2) 如何获取仅包含由键指定的键值对的映射?差不多 val ab = abc.slice(keys) // equivalent to mapOf(1 to "a", 2 to "b) 我在找一件比这更优雅的东西 val ab = listOf(1

给你一张地图和一列钥匙

val abc = mapOf(1 to "a", 2 to "b", 3 to "c")
val keys = listOf(1, 2)
如何获取仅包含由
键指定的键值对的映射?差不多

val ab = abc.slice(keys)
// equivalent to mapOf(1 to "a", 2 to "b)
我在找一件比这更优雅的东西

val ab = listOf(1, 2).map { it to abc[it] }.toMap()
例如,在长生不老药中:

abc=%{1=>“a”,2=>“b”,3=>“c”}
ab=地图。采取(abc,[1,2])
#相当于ab=%{1=>“a”,2=>“b”}
您可以使用:

由于是Kotlin,你甚至可以定义自己的目标,以实现你的想象:

fun <T> Map<T, *>.slice(keys: Iterable<T>) = filterKeys { it in keys }

val ab = abc.slice(keys)
funmap.slice(keys:Iterable)=filterKeys{it in keys}
val ab=abc.slice(键)

以上答案中给出的解决方案确实解决了问题,但我认为有必要做一些小改动

问题是,对于
映射中的每个
,他们都会检查
列表
是否包含
,这是
O(n)
操作,对于小列表这是可以的,但一旦达到某个大小,它就会变得非常缓慢。我建议您将键的
列表
转换为
集合
,这样在一般情况下,contains操作将减少到
O(1)
。(因此减少了碳足迹:))

以下是包含上述变更的解决方案

val mapAbc = mapOf(1 to "a", 2 to "b", 3 to "c")
val keySet = listOf(1, 2).toSet()
val filteredMap = mapAbc.filterKeys { it in keySet }

it in keys
对于大型列表来说不是一个好主意,这使得整个操作成为O(mXn)。它的效率不比
listOf(1,2)高,步骤也不比
listOf(1,2)少。从这个问题出发,将{it]映射到abc[it]}.toMap()
,尽管我不好,但我忽略了这一部分。但关键是,列表上的contains操作非常昂贵,如果需要执行多个操作,则需要重新考虑数据结构。事情总是从一开始就很小,在您知道应该只存储100个元素的列表之前,它最终会存储10000个项目,这使得您的运行时不太理想
fun <T> Map<T, *>.slice(keys: Iterable<T>) = filterKeys { it in keys }

val ab = abc.slice(keys)
val mapAbc = mapOf(1 to "a", 2 to "b", 3 to "c")
val keySet = listOf(1, 2).toSet()
val filteredMap = mapAbc.filterKeys { it in keySet }