假设我有一个迭代器:
val it = List("a","b","c").iterator
Run Code Online (Sandbox Code Playgroud)
我想要一份副本; 我的代码是:
val it2 = it.toList.iterator
Run Code Online (Sandbox Code Playgroud)
这是正确的,但似乎并不好.有没有其他API可以做到这一点?
Rex*_*err 19
你正在寻找的方法是duplicate.
scala> val it = List("a","b","c").iterator
it: Iterator[java.lang.String] = non-empty iterator
scala> val (it1,it2) = it.duplicate
it1: Iterator[java.lang.String] = non-empty iterator
it2: Iterator[java.lang.String] = non-empty iterator
scala> it1.length
res11: Int = 3
scala> it2.mkString
res12: String = abc
Run Code Online (Sandbox Code Playgroud)
警告:至少从Scala 2.9.0开始,这会将原始迭代器留空.你可以 val ls = it.toList; val it1 = ls.iterator; val it2 = ls.iterator 得到两份.或者使用复制(也适用于非列表).
Rex的答案在于本书,但实际上你的原始解决方案对于scala.collection.immutable.List来说是最有效的.
列表迭代器可以使用该机制进行复制,基本上没有开销.这可以通过快速查看scala.collection.immutable.LinearSeq中的iterator()的实现来确认.toList方法的定义,它简单地返回后备Seq的_.toList,如果它是List(就像你的情况那样)是标识.
在调查你的问题之前,我并不知道List迭代器的这个属性,我非常感谢这些信息......除此之外,它意味着许多"列表修改"算法可以使用迭代器在Scala不可变列表上高效实现像鹅卵石一样.
| 归档时间: |
|
| 查看次数: |
3269 次 |
| 最近记录: |