2017-12-10 7 views
0

Ich versuche, die Wörter einer Datei in einen Stream zu lesen und die Anzahl zu zählen, wie oft das Wort "the" in der Datei erscheint. Ich kann keinen effizienten Weg finden, dies nur mit Streams zu tun.Ein Wort aus einer Datei mit einem Stream lesen

Beispiel: Wenn die Datei einen Satz enthielt wie: "Der Junge sprang über den Fluss." würde der Ausgang 2

sein Das ist, was ich versucht habe bisher

public static void main(String[] args){ 

    String filename = "input1"; 
    try (Stream<String> words = Files.lines(Paths.get(filename))){ 
     long count = words.filter(w -> w.equalsIgnoreCase("the")) 
       .count(); 
     System.out.println(count); 
    } catch (IOException e){ 

    } 
} 
+2

Bitte geben Sie uns Codebeispiele von dem, was Sie bis jetzt versucht haben. So können wir Ihnen effektiver helfen. – Ivonet

Antwort

0

Sie Java StreamTokenizer für diesen Zweck verwenden können.

import java.io.ByteArrayInputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.StreamTokenizer; 
import java.io.InputStreamReader; 
import java.nio.charset.StandardCharsets; 

public class Main { 

    public static void main(String[] args) throws IOException { 
     long theWordCount = 0; 
     String input = "The boy jumped over the river."; 
     try (InputStream stream = new ByteArrayInputStream(
      input.getBytes(StandardCharsets.UTF_8.name()))) { 
     StreamTokenizer tokenizer = 
      new StreamTokenizer(new InputStreamReader(stream)); 
      int tokenType = 0; 
      while ((tokenType = tokenizer.nextToken()) 
       != StreamTokenizer.TT_EOF) { 
       if (tokenType == StreamTokenizer.TT_WORD) { 
        String word = tokenizer.sval; 
        if ("the".equalsIgnoreCase(word)) { 
         theWordCount++; 
        } 
       } 
      } 
     } 
     System.out.println("The word 'the' count is: " + theWordCount); 
    } 
} 
0

Gerade Linie Name schon sagt Files.lines kehrt Strom von Linien nicht Worte. Wenn Sie über Worte wiederholen möchte ich Ihnen Scanner wie

Scanner sc = new Scanner(new File(fileLocation)); 
while(sc.hasNext()){ 
    String word = sc.next(); 
    //handle word 
} 

verwenden können, wenn Sie wirklich verwenden möchten Streams können Sie jede Zeile geteilt und dann mit diesen Worten Karte Stream

try (Stream<String> lines = Files.lines(Paths.get(filename))){ 
    long count = lines 
      .flatMap(line->Arrays.stream(line.split("\\s+"))) //add this 
      .filter(w -> w.equalsIgnoreCase("the")) 
      .count(); 
    System.out.println(count); 
} catch (IOException e){ 
    e.printStackTrace();//at least print exception so you would know what wend wrong 
} 

BTW shouldn Sie Lege keine leeren catch-Blöcke ab, zumindest drucke die Exception, die geworfen wurde, damit du mehr Informationen über das Problem hast.

+0

teilt sich der reguläre Ausdruck im .split-Befehl auch entlang neuer Zeilenzeichen auf, wie zum Beispiel ein Bruch zwischen Absätzen? –

+0

@AddisonWaege Wahrscheinlich. '\ s' steht für eine breite Palette von Leerstellen und ist normalerweise ausreichend für diese Art von Aufgaben. Testen Sie es und Sie werden es herausfinden. – Pshemo

0

Verwenden Sie den Stream-Reader, um die Anzahl der Wörter zu berechnen.

Verwandte Themen