2016-06-04 4 views
0

Dies ist mein allererster Versuch für scala in play framework. Was ich wirklich erreichen möchte, ist, jedes erste Wort aus Sätzen in einem Absatz zu nehmen.Sequence Map löst einen Fehler aus: NoSuchElementException: next on leerer Iterator

Dies ist der Code, der

Text ist mutable.Seq [Zeichenfolge]

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

Aber das Problem ist auf der 2. Zeile einen Fehler wirft. Es löst eine Fehlermeldung, dass:

[NoSuchElementException: next on empty iterator]

In meiner bescheidenen Meinung nach, Satz durch Leerzeichen getrennt wird nicht leer sein, solange der sometext ein echter Absatz mit vielen Sätzen.

Könnte jemand klären, wie dies geschehen könnte und wie man es beheben könnte?

+0

Sie verwenden '.head' die unsicher ist. Besser, '.headOption' zu verwenden. – cchantep

+0

@cchantep Danke. 'headOption' behebt dies. –

+0

Die Verwendung von 'headOption' wird das Problem beheben, wird Ihnen aber nicht sagen, was es war. Es ändert auch den Typ des Ergebnisses. Denken Sie darüber nach, was passiert, wenn einer der Eingabezeichenfolgen leer ist oder nur Leerzeichen enthält. Sie sollten lernen, Debugging (oder Ausdruckanweisungen) zu verwenden, um solche Fragen selbst zu beantworten. – Dima

Antwort

-1

Sie verwenden die Operation .head, die unsicher ist (Ausnahme für den Fall, dass die Sammlung leer ist).

Sie würden besser .headOption verwenden:

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

Das erklärt die 'NoSuchElementException' der Frage, also @Dima können Sie konstruktiv erklären, warum Sie es nicht als eine Antwort betrachten? – cchantep

1
  1. Zuerst denke ich, dass Ihre Regex nicht in Ordnung ist, sehen here. Es wird jedes Zeichen mit dem Punkt . übereinstimmen. Wenn Sie es als Punkt-Zeichen behandeln möchten, müssen Sie es wie \\. entkommen.
  2. Ist Ihre someText eine Option[String]? Ich verstehe nicht, warum Sie flatMap es.
  3. Wenn Sie head für eine leere Sammlung aufrufen, erhalten Sie eine Ausnahme, beachten Sie dies.
  4. Wenn noch Ihre Frage hält, ich würde das so etwas wie tun:

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