2016-06-04 5 views
0

Это моя самая первая попытка для scala в игровой среде. То, что я действительно хочу достичь, - это принять каждое первое слово из предложений в абзаце.Карта последовательности отображает ошибку: NoSuchElementException: next on empty iterator

Это код, который выдает ошибку

текст mutable.Seq [String]

someText.flatMap(_ split "[.?!]") 
    .map(_ split "\\s+" filter !_.equals("") head) 
    .toList 

Но проблема на 2-й линии. Он выдает ошибку о том, что:

[NoSuchElementException: next on empty iterator]

По моему скромному мнению, предложение разделенных пробелами не будет пустым, пока SOMETEXT настоящий пункт с большим количеством предложений.

Может ли кто-нибудь уточнить, как это могло произойти и как его исправить?

+0

Вы можете использовать '.head', который является небезопасным. Лучше использовать '.headOption'. – cchantep

+0

@cchantep Спасибо. 'headOption' исправить это. –

+0

Использование 'headOption' устранит проблему, но не сообщит вам, что это было. Он также изменяет тип результата. Подумайте, что произойдет, если одна из входных строк пуста или содержит пробелы. Вы должны научиться использовать отладочную (или распечатывать инструкции) для ответа на подобные вопросы самостоятельно. – Dima

ответ

-1

Используется операция .head, которая является небезопасной (исключение в случае, если коллекция пуста).

Лучше использовать .headOption:

someText.flatMap(_ split "[.?!]") 
    .flatMap(_ split "\\s+" filter !_.equals("") headOption toList) 
    .toList 
+0

Это объясняет 'NoSuchElementException' вопроса, поэтому @Dima вы можете объяснить конструктивно, почему вы не считаете его ответом? – cchantep

1
  1. Во-первых, я думаю, что ваше регулярное выражение не в порядке, см here. Он будет соответствовать любому персонажу с точкой .. Если вы хотите рассматривать его как символ точки, вам нужно избежать его, как \\..
  2. Является ли ваш someText a Option[String]? Я не понимаю, почему вы это flatMap.
  3. Когда вы вызываете head на пустую коллекцию, вы получите исключение, помните об этом.
  4. Если ваш вопрос по-прежнему имеет место, я хотел бы сделать что-то вроде этого:

val someTex = "" val lines = someText.split("\\.").map(_.trim).toList val firstWords = lines.flatMap(_.split("\\s+").headOption)

Смежные вопросы