Wörter zählen mit Java
Beim Programmieren meines Webcrawlers/ Spider musste ich herausfinden wie oft eine Zeichenfolge in einem Quellcode vor kommt. Dabei vermisste ich eine Methode, die mir diese Anzahl angibt. Eine Lösung hab ich gefunden, welche ich euch nicht vorenthalten will.
Das Beispiel wird mit einer Textdatei “woerter.txt” gemacht, in der ich das Wort “Java” zählen und ganz einfach ausgeben will.
Hier die Textdatei “woerter.txt”
Wie geht es euch? Ich bin grad dran was in Java zu programmieren.
Es handelt sich um einen Webcrawler. Dieser wird mit Java und MySQL kombiniert.
Ich denke Java kann diese Aufgabe gut loesen.
Nun müssen wir im Java-Programm die Datei “woerter.txt” öffnen. Im folgenden Quellcode sind alle benötigten Variablen deklariert. Es wird auch die Datei “woerter.txt” geöffnet und eine While-Schlaufe gestartet, die pro Schlaufendurchgang eine Linie in die Variable “line” einliest.
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class zaehleWoerter {
/*
* Code by www.klajo.com
*/
public static void main(String[] args) {
BufferedReader fr;
String line; //Hier wird immer eine Linie von woerter.txt gespeichert
String toCount = "Java"; //Die zu zaehlende Zeichenfolge
int anzahlVorkommnisse = 0; //Variable, die festhaellt wie oft "Java" vorkommt
int stringPos = 0; //Aktueller Index / Zeichenposition
try{
fr = new BufferedReader(new FileReader("C:/workspace/Experiments/src/woerter.txt"));
while ((line = fr.readLine())!= null) {
}
fr.close();
} catch(FileNotFoundException e) {
System.out.println("FileNotFoundException eingetreten");
} catch (IOException e){
}
}
}
Dieser Code genügt noch nicht, damit das Wort “Java” gezählt werden kann. Der Quelltext muss noch erweitert werden. Der zu erweiternde Code wird in der While-Schlaufe geschrieben, in der eine Linie der Textdatei “woerter.txt” eingelesen wird.
Nun kann die einzelne eingelesene Zeile analysiert werden. Also wird in einer Zeile einmal das Wort “Java” gefunden, wird die Variable “AnzahlVorkommnisse” um 1 inkrementiert.
Hier kommt uns eine String-Methode zu Nutze, und zwar handelt es sich dabei um die Methode “indexOf(gesuchteZeichenfolge, abStelle)”, welche mir die Stelle zurück gibt, in der die gesuchte Zeichenfolge beginnt. Wird die Zeichenfolge von der Methode nicht gefunden, so gibt “indexOf” als Resultat -1 zurück. (URL: http://java.sun.com/j2se/1.5.0/docs/api/java/lang/String.html#indexOf(java.lang.String,%20int))
Hier ein Codeschnippsel des ganzen Programmes, der bei einer einzigen Linie das Wort “Java” zählt.
while(line.indexOf(toCount, stringPos)!=-1){
stringPos = line.indexOf(toCount, stringPos);
stringPos++;
anzahlVorkommnisse++;
}
Solange indexOf() nicht -1 zurück gibt, wird mit indexOf() gesucht, wo “Java” (toCount) als erstens vorkommt. Danach wird im nächsten Schlaufendurchlauf ab einer Stelle weiter gesucht. Und jedes mal wird bei einem Fund die Variable anzahlVorkommnisse um 1 inkrementiert.
Hier noch der ganze Quellcode. Hoffe ihr habts einigermassen verstanden, schreibt mir sonst.
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class zaehleWoerter {
/*
* Code by www.klajo.com
*/
public static void main(String[] args) {
BufferedReader fr;
String line; //Hier wird immer eine Linie von woerter.txt gespeichert
String toCount = "Java"; //Die zu zaehlende Zeichenfolge
int anzahlVorkommnisse = 0; //Variable, die festhaellt wie oft "Java" vorkommt
int stringPos = 0; //Aktueller Index / Zeichenposition
try{
fr = new BufferedReader(new FileReader("C:/workspace/Experiments/src/woerter.txt"));
while ((line = fr.readLine())!= null) {
while(line.indexOf(toCount, stringPos)!=-1){
stringPos = line.indexOf(toCount, stringPos);
stringPos++;
anzahlVorkommnisse++;
}
stringPos = 0;
}
fr.close();
} catch(FileNotFoundException e) {
System.out.println("FileNotFoundException eingetreten");
} catch (IOException e){
}
System.out.println("Das Wort " + toCount + " kommt " + anzahlVorkommnisse + " mal vor.");
}
}







am 4. Sep. 2007
Ich hab den Code jetzt nicht ausprobiert, aber ich denke, dass z.B. das Suchwort “mama” im Text “asdf mamama fasdf” zwei Treffer landen wird.
Wenn man so ein Verhalten verhindern möchte kann man statt dem stringPos++; ein stringpos += toCount.length(); verwenden.