все, кроме последнего элемента из итератора Scala (a.k.a. Iterator.init) - PullRequest
17 голосов
/ 18 августа 2010

У меня есть несколько больших файлов, в которых я хочу обработать все, кроме последней строки в каждом файле.Если бы файлы были небольшими, я мог бы просто преобразовать их в TraversableLike и использовать метод «init», например:

lines.toList.init

Но файлы велики, поэтому мне нужно оставить все как итератор.Есть ли простой способ получить что-то вроде «init» на итераторе?Я рассматриваю следующее, но я не уверен, что это всегда будет работать:

lines.takeWhile(_ => lines.hasNext)

Ответы [ 2 ]

14 голосов
/ 18 августа 2010

Вы полагаетесь на takeWhile, который сначала захватывает следующую строку, а затем проверяет, есть ли другая строка.Так работает в итераторе по умолчанию.И для любого конкретного итератора, я ожидаю, что, если он когда-либо будет работать, он всегда должен работать.

Если он когда-нибудь потерпит неудачу, вам нужно будет кэшировать результат.Вы можете создать свой собственный итератор, который делает это, или, что проще (если это не срочно критичный к производительности код):

lines.sliding(2).map(_.head)

Проверьте это следующим образом:

List(1,2,3,4,5).iterator.sliding(2).map(_.head).toList

Вы не должны полагаться на takeWhile или любой другой метод, ведущий себя каким-либо конкретным образом;если sliding не сломан, он будет иметь вышеуказанное поведение.

6 голосов
/ 09 октября 2012

Если вы хотите пропустить первые 2 строки и удалить последние 4, вы можете выполнить итерацию с помощью

List(1, 2, 3).toIterable.drop(1).dropRight(1)

Если у вас уже есть IterableLike

il.drop(1).dropRight(1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...