【问题标题】:How did this code using zip() got the indexes of the elements in the list?这段使用 zip() 的代码是如何获得列表中元素的索引的?
【发布时间】:2021-10-14 10:03:13
【问题描述】:

我正在解决一本 Kotlin 编程书籍的练习题。任务是使用“zip()”实现函数并返回一个Pairs的“List”,其中“Pair”中的第一项是元素,第二项是该元素的索引。

我完成了练习,解决方案有效,但我无法理解书上的解决方案。

这是我的解决方案:

fun zipWithIndex(listToTake: List<Any>): List<Pair<Any, Any>> {
    val finalList = mutableListOf<Any>()
    var num = 0
    for(element in listToTake) {
        finalList += num
        num ++
    }
    return (listToTake zip finalList)
}
fun main() {
    val listToCall = listOf<String>("a", "b", "c")
    println(zipWithIndex(listToCall))
}

这是本书的解决方案:

fun <T> List<T>.zipWithIndex(): List<Pair<T, Int>> =
  zip(indices)

fun main() {
  val list = listOf('a', 'b', 'c')
  list.zipWithIndex() eq
    "[(a, 0), (b, 1), (c, 2)]"
}

有人可以解释一下本书的解决方案如何获取列表中元素的索引,或者告诉我我需要阅读的主题以弄清楚书中的代码是如何工作的。

提前感谢您的帮助。

【问题讨论】:

  • 检查the docs for indices - 它返回一个包含集合索引的范围,所以如果你用它自己的索引列表压缩一个列表(然后这个范围被解释为它所有值的列表) , 你得到了完全想要的结果。
  • @CherryDT 谢谢!你帮了我很多)
  • Atomic Kotlin → 函数式编程 → 操作列表 → Exercise 1 :-)
  • 一个 IDE(例如 IntelliJ IDEA)对于研究这类事情非常有用:它可以向您显示每个对象、方法、属性等的文档和源代码。

标签: kotlin


【解决方案1】:

indices 是每个 kotlin 列表的属性:https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-list/#extension-properties

它是所有有效索引的 IntRange,因此范围 (https://kotlinlang.org/docs/ranges.html) 基本上相当于 [0, 1, 2]。 IntRange 是一个 Iterable,因此可以对其进行压缩(list 的 api 文档中的第三个 zip 重载)。

所以它等同于你所做的 zip,除了你自己构造了 [0, 1, 2] 而他们使用了 List 的预先存在的属性。

他们还在 List (https://kotlinlang.org/docs/extensions.html#extension-functions) 上定义了一个扩展函数,而不是将列表作为参数传递。

【讨论】:

  • 感谢您的全面回答。现在很清楚代码是如何工作的:D
  • 您还应该补充一点,this 是扩展函数中的隐式接收者(对象),因此不需要指定;它在对象上查找。否则,长/完整版本将是 this.zip(this.indices)
猜你喜欢
  • 2013-12-03
  • 1970-01-01
  • 2021-03-05
  • 1970-01-01
  • 2011-05-05
  • 1970-01-01
  • 2020-01-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多