首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取SortedMap中的前N个元素?

获取SortedMap中的前N个元素?
EN

Stack Overflow用户
提问于 2020-10-21 17:21:23
回答 4查看 113关注 0票数 1

有没有从SortedMap中获取前N个元素的正确方法?我的变体是:

代码语言:javascript
复制
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
    }
}
EN

回答 4

Stack Overflow用户

发布于 2020-10-21 17:56:32

例如,headMap也是获取此地图一部分的一个很好的解决方案

代码语言:javascript
复制
      return when {
        sortedMap.size >= 20 -> {
            sortedMap.headMap(sortedMap.keys.elementAt(20))
        }
        else -> {
            sortedMap
        }
    }

有关文档here的更多信息

票数 3
EN

Stack Overflow用户

发布于 2020-10-21 17:48:20

代码语言:javascript
复制
val first20AsList: List<Map.Entry<String, Int>> = sortedMap.asIterable().take(20)
val first20AsMap: Map<String, Int> = first20AsList.associate { it.toPair() }
票数 2
EN

Stack Overflow用户

发布于 2020-10-21 17:49:05

解决方案

在我看来,最好的方法是使用asSequence(),因为它的评估是懒惰的:

代码语言:javascript
复制
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() }转换为排序映射之前

代码语言:javascript
复制
return sortedMapOf(
    *sortedMap.asSequence().take(20)
         .map{ it.key to it.value }
         .toList().toTypedArray())
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64460512

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档