StringTokenizer liczenie słów w pliku.

StringTokenizer liczenie słów w pliku.
0
public static int numberOFWords(FileReader r) throws IOException {
    BufferedReader b = new BufferedReader(r);
    String line = "";
    String page = "";
    int count= 0;
    String[] array;
    while ((line = b.readLine())!= null) 
        page += line+ " ";
    StringTokenizer st = new StringTokenizer(page);
    array = new String[st.countTokens()];
    while (st.hasMoreTokens()) {
        array[count] = st.nextToken();
        count++;
    }
    b.close();
    return count;
}

}

Ta metoda ma zliczać ilość słów w pliku, ale cały czas zwraca że słów jest 0. Gdzie popełniłam błąd?

iooi
  • Rejestracja:prawie 15 lat
  • Ostatnio:ponad 11 lat
  • Postów:573
0

Po co wrzucać słowa w tablicę, skoro potrzeba zwrócić tylko ich ilość? Tutaj przydałby się Scanner:

Kopiuj
public static int numberOfWords(FileReader reader) {
    Scanner scanner = new Scanner(reader);
    int count = 0;
    while (scanner.hasNext()) {
        scanner.next();
        count++;
    }
    scanner.close();
    return count;
}

Twoja metoda u mnie działa, pokaż wejście, dla którego zwraca 0.

edytowany 4x, ostatnio: iooi
0

to jest w programie:
try {
System.out.println("Podaj ścieżkę dostępu do pliku: ");
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String sciezka = br.readLine();
FileReader in = new FileReader(sciezka);
System.out.println("Liczba slów: " + numberOFWords(in));
....
coś źle?

iooi
  • Rejestracja:prawie 15 lat
  • Ostatnio:ponad 11 lat
  • Postów:573
0

I dla jakich plików zwraca 0? Testowałaś moje rozwiązanie?
Btw, jeśli dołączasz do Stringa nową linię co każdą iterację pętli, lepiej zrobić to na StringBuilderze:

Kopiuj
String line;
StringBuilder builder = new StringBuilder();
while ((line = b.readLine()) != null) {
    builder.append(line).append(" ");
}

StringTokenizer st = new StringTokenizer(builder.toString());
edytowany 2x, ostatnio: iooi
0

import java.io.*;
import java.util.Scanner;

class klasak {

public static void main(String[] args) {
    try {
        System.out.println("Podaj ścieżkę dostępu do pliku: ");
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String sciezka = br.readLine();
        FileReader in = new FileReader(sciezka);
        System.out.println("Ilość linii: " + numberOfLines(in));
        System.out.println("Liczba slów: " + numberOFWords(in));
        in.close();
        br.close();

    } catch (FileNotFoundException e) {
        System.out.println("Plik nie istnieje");
        System.exit(1);
    } catch (IOException ex) {
        ex.printStackTrace();
    }
}

public static int numberOfLines(FileReader r) throws IOException {
    LineNumberReader ln = new LineNumberReader(r);
    int count = 0;
    while (ln.readLine() != null) {
        count++;
    }
    return count;
}

public static int numberOFWords(FileReader r) {
    Scanner skaner = new Scanner(r);
    int count = 0;
    while (skaner.hasNext()) {
        skaner.next();
        count++;
    }
    skaner.close();
    return count;
}

}

Dalej zwraca zero a linijki liczy normalnie.

iooi
  • Rejestracja:prawie 15 lat
  • Ostatnio:ponad 11 lat
  • Postów:573
0

A, no teraz błąd jest oczywisty. Najpierw w numberOfLines() czytasz cały plik, a potem z tego samego FileReadera chcesz przeczytać słowa.

edytowany 2x, ostatnio: iooi
0

Zwykły notatnik i byle jaka treść:
aaaaaaaaaa bbbbbbbbbb
cccccccccc dddddddd
eeeeeeeeee gggggggggggg
tttttttttttt hhhhhhhhhh
rrrrrrrrrrr

iooi
  • Rejestracja:prawie 15 lat
  • Ostatnio:ponad 11 lat
  • Postów:573
0

Poprawiłem poprzedni post. Najprostszym rozwiązaniem byłoby stworzenie nowego FileReadera.

0

Bardzo serdecznie dziękuję, już działa.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.