все, кроме последнего элемента из итератора Scala (он же Iterator.init )

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

lines.toList.init

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

lines.takeWhile(_ => lines.hasNext)
17
задан Steve 18 August 2010 в 11:49
поделиться

1 ответ

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

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

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

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

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

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

14
ответ дан 30 November 2019 в 13:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: