Предположим, что у меня есть итератор:
val it = List("a","b","c").iterator
Я хочу его копию; мой код:
val it2 = it.toList.iterator
Это правильно, но кажется не очень хорошим. Есть ли другой API для этого?
Предположим, что у меня есть итератор:
val it = List("a","b","c").iterator
Я хочу его копию; мой код:
val it2 = it.toList.iterator
Это правильно, но кажется не очень хорошим. Есть ли другой API для этого?
Предупреждение: по крайней мере, начиная с Scala 2.9.0, это оставляет исходный итератор пустым. Вы можете val ls = it.toList; val it1 = ls.iterator; val it2 = ls.iterator получить две копии. Или используйте дубликат (который работает и для не-списков).
Ответ Rex по книге, но на самом деле ваше оригинальное решение на сегодняшний день является наиболее эффективным для scala.collection.immutable.List's.
Список итераторов можно дублировать с использованием этого механизма, при этом, по существу, не накладные расходы. Это может быть подтверждено быстрым обзором реализации итератора() в scala.collection.immutable.LinearSeq, esp. определение метода toList, который просто возвращает _.toList поддержки Seq, который, если он является списком (как и в вашем случае), является личным.
Я не знал об этом свойстве итераторов List, прежде чем исследовать ваш вопрос, и я очень благодарен за информацию... среди прочего, это означает, что многие алгоритмы "перекачки списка" могут эффективно выполняться над Scala неизменяемые списки, использующие итераторы как гальки.
Метод, который вы ищете, это 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