有没有从SortedMap中获取前N个元素的正确方法?我的变体是:
val sortedMap = map.filterValues { it in sortedValues }.toSortedMap()
if (sortedMap.size <= 20) {
return sortedMap
}
var result = mutableMapOf<String, Int>()
for ((key, value) in sortedMap) {
result[key] = value
if (result.size == 20) {
break
}
}发布于 2020-10-21 17:56:32
例如,headMap也是获取此地图一部分的一个很好的解决方案
return when {
sortedMap.size >= 20 -> {
sortedMap.headMap(sortedMap.keys.elementAt(20))
}
else -> {
sortedMap
}
}有关文档here的更多信息
发布于 2020-10-21 17:48:20
val first20AsList: List<Map.Entry<String, Int>> = sortedMap.asIterable().take(20)
val first20AsMap: Map<String, Int> = first20AsList.associate { it.toPair() }发布于 2020-10-21 17:49:05
解决方案
在我看来,最好的方法是使用asSequence(),因为它的评估是懒惰的:
return sortedMap.asSequence().take(20).map{ it.toPair() }.toMap()关于懒惰评估的信息
一般来说,使用可迭代容器的惰性变体通常是有利的,因为这意味着在许多情况下,不需要评估整个数据结构,而只需要评估所需的那部分数据。
在您的例子中,这将是SortedMap中的第一个N。如果它真的会带来性能优势,这是值得怀疑的,但至少是可能的。
来自stack-overflow和kotlin的一些关于惰性序列的信息:
老生常谈:
由于@IR42的评论,这个答案在一些细节上得到了改进。在我再次使用spread运算符(通过sortedMapOf)和map { it.key to it.value }而不是{ it.toPair() }转换为排序映射之前
return sortedMapOf(
*sortedMap.asSequence().take(20)
.map{ it.key to it.value }
.toList().toTypedArray())https://stackoverflow.com/questions/64460512
复制相似问题