2016-05-17 6 views
0

Die meiste Zeit funktioniert es richtig. Selten zählt es um eins. Irgendwelche Ideen?Warum ist mein Wortzähler manchmal um eins ausgeschaltet?

public static int countWords(File file) throws FileNotFoundException, IOException{ 
     BufferedReader br = new BufferedReader(new FileReader(file)); 
     String line; 
     List<String> strList = new ArrayList<>(); 

     while ((line=br.readLine())!=null){ 
      String[] strArray= line.split("\\s+"); 
      for (int i=0; i<strArray.length;i++){ 
       strList.add(strArray[i]); 
      } 
     } 
     return strList.size(); 

    } 

Besonders im Beispiel unten es 3 gibt statt 2:

\n 
      k 
+0

Sind Sie der Meinung, dass '\ n' ein Wort ist? Ich würde denken, 'k' ist das einzige * Wort in deinem Beispiel. –

+2

Ich denke, es zählt neue Zeile als 1, Tab als 2nd und dann k als 3rd;) –

+0

Wie kann ich es beheben? @BilboBaggins –

Antwort

1

Wenn Sie Java 8 verwenden, können Sie Streams verwenden und filtern, was Sie als "Wort" in Betracht ziehen. Zum Beispiel:

List<String> l = Files.lines(Paths.get("files/input.txt")) // Read all lines of your input text 
      .flatMap(s->Stream.of(s.split("\\s+"))) // Split each line by white spaces 
      .filter(s->s.matches("\\w")) // Keep only the "words" (you can change here as you want) 
      .collect(Collectors.toList()); // Put the stream in a List 

In diesem speziellen Fall wird es ausgegeben [k].

Sie können natürlich das Gleiche tun in Java 7 durch Ihren Code anzupassen und diese Bedingung in Ihrer for Schleife hinzu:

if(strArray[i].matches("\\w")) 
    strList.add(strArray[i]); // Keep only the "words" - again, use your own criteria 

Es nur umständlicher ist.

Ich hoffe es hilft.

+0

Warum ziehen Sie Streams zu einem so einfachen Problem? – Nikem

+0

Die Datei ist ein Strom von Linien und die Zeilen sind Ströme von Wörtern. Es ist nicht notwendig, 'BufferedReader' und' FileReader' zu verwenden oder explizite Schleifen zu machen. Das Ergebnis ist kürzer und lesbarer. – joel314

+0

Aber Sie lesen die ganze Datei in den Speicher. Wenn die Datei groß ist, ist es besser, Zeile für Zeile zu lesen. Ihr Code wird viel mehr Speicher verbrauchen. – Nikem

2

Ich denke, die zweite Zeile ist in zwei Strings aufgeteilt, "" und "k". Siehe unten stehenden Code:

import java.util.Arrays; 

public static void main(String[] args) { 
    String str = "   k"; 
    String[] array = str.split("\\\s+"); 
    System.out.println("length of array is " + array.length); // length is 2 
    System.out.println(Arrays.toString(array)); //array is [, k] 
}