【问题标题】:Is it possible to set the Map iterator to a certain position in Kotlin?是否可以将 Map 迭代器设置为 Kotlin 中的某个位置?
【发布时间】:2021-08-02 16:53:25
【问题描述】:

假设我有一张地图:Map<Int, String>,我知道这张地图是如何创建的,并且它保留了迭代的顺序。如何迭代给定范围内的所有元素?

val map: Map<Int, String> = mapOf(
    1 to "one", 
    2 to "two", 
    3 to "three", 
    4 to "four")

// Let's say I want to get all values after key 3.

val iterator = map.iterator()
while (iterator.next().key != 3) {}
val itemsAfter3 = iterator.asSequence().map { it.value }

除了丑,就是O(n)。有没有更好、更优雅、更高效的方式?

我正在考虑用map.keys.indexOf() 做点什么,但这里的复杂性似乎也是线性的。

【问题讨论】:

  • Map-interface 不支持此功能,因此您要么必须使用不同的数据结构,要么直接使用 Map 实现类来实现它。
  • "it is O(n)" LinkedHashMap,则不能。

标签: kotlin collections iterator


【解决方案1】:

永远不要依赖内部实现,将来可能会改变。如果您需要在迭代期间保留插入顺序的映射,请显式声明:

val map: Map<Int, String> = linkedMapOf(
    1 to "one",
    2 to "two",
    3 to "three",
    4 to "four"
)

获取特定索引后的所有值很简单:

val valuesAfterIndex3 = map.values.drop(3)

【讨论】:

    猜你喜欢
    • 2022-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-04
    • 1970-01-01
    • 1970-01-01
    • 2010-10-17
    • 1970-01-01
    相关资源
    最近更新 更多