【问题标题】:Bug in Scala 2.10, Iterator.size?Scala 2.10 中的错误,Iterator.size?
【发布时间】:2013-10-27 19:02:24
【问题描述】:

这正常吗?

scala> val x = Iterator(List[String]("str"))
lol: Iterator[List[String]] = non-empty iterator

scala> x.size
res1: Int = 1

scala> x.size
res2: Int = 0

实际上我遇到了其他奇怪的错误.. 一个可能的错误?

【问题讨论】:

  • 来自scala-lang.org/api/current/#scala.collection.Iterator "特别重要的是要注意,除非另有说明,在调用迭代器方法后,永远不要使用迭代器。 最重要的两个exceptions 也是唯一的抽象方法:next 和 hasNext。”
  • 答案附录:如果您需要一个普通的集合对象,只需调用例如toSeq 或 toSet 在您的迭代器上。然后丢弃迭代器并处理集合。

标签: scala iterator


【解决方案1】:

不,这不是错误。这是正常行为。

迭代器是可变的东西。您可以将它们视为指针。每次你要求一个迭代器给你它指向的下一个元素时,它都会移动一个位置。

当您要求它提供大小时,它将遍历它指向的序列中的每个元素,每次向右移动一个位置。当它没有更多元素要遍历iterator.hasNext == false 时,它将返回大小。但到那时它将耗尽所有元素。当对size 进行新调用时,迭代器已经定位在末尾,所以它会立即返回 0。

为了更好地了解正在发生的事情,您可以这样做:

val it = Iterator(1, 2, 3, 4)
//it: >1 2 3 4
it.next() //ask for the next element
//it: 1 >2 3 4
it.next()
//it: 1 2 >3 4
println(it.size) // prints 2
//it: 1 2 3 4 >
println(it.size) // prints 0

【讨论】:

    【解决方案2】:

    这很正常。要找出Iterator 的大小,您必须遍历它直到它为空。

    然后它是空的(大小 == 0)。

    要小心使用迭代器,因为它们是非常脆弱的数据结构。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-01
      • 1970-01-01
      • 2015-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多