# Ein bestimmtes Wort in einem Text zählen (String in String)



## Martina (21. Feb 2012)

Hallo liebe Java-isten,

ich habe schon viele Threats zum Thema Wörter zählen oder String-in-String-Suche gefunden, aber leider konnte ich keine Lösung auf mein Problem übertragen.
Vielleicht kann mir jemand ja bei meiner Aufgabe helfen?

Ich möchte in einem Text (String z.B. aus einer Datei) ein bestimmtes Wort zählen. Hintergrund ist eine rudimentäre Text-Analyse. Zum Beispiel möchte ich zählen, wie oft das Wort "Java" in einem Text vorkommt.

Eine FileReader-Methode ist schon geschrieben, sodass der zu durchsuchende Text in einem String gespeichert ist.
Nachdem ich versucht habe, mit RegEx eine solche Zähl-Methode zu bauen, glaube ich, dass man es besser mit der Funktion _indexOf_ lösen könnte. Doch genau dabei habe ich so meine Probleme.

Hier ist mein Code:

```
private int countWord(String s, String word){
	int count = 0;
	int start = 0;
	for (int i=0; i< s.length(); i++){
		if(s.indexOf(word,start) > -1)
		{
			System.out.println(word + " found at " + s.indexOf(word,start) + " started at " + start);
			count++;
			start += word.length();
		}
	}
	return count;
}
```

Diese Methode sollte zählen, wie oft der String "word" im String "s" vorkommt.
Leider läuft sie bis zum Absturz und liefert auch kein richtiges Ergebnis. 

Kann mir jemand bitte sagen, wo mein Denkfehler liegt?


----------



## Michael... (21. Feb 2012)

Zunächst einmal ist die for Schleife die über jeden einzelnen Buchstaben des Strings iteriert falsch.
Hier könnte man eine while Schleife nehmen, die solange läuft solange indexOf(word, start) einen Wert größer -1 liefert.
Dann muss man start bei jedem Schleifendurchgang so manipulieren, das es größer als der zuletzt gefundene Index ist. Wenn Du mit 0 startest, das Wort das erstmal bei Index 2000 vorkommt nutzt es ja nichts, wenn Du start = 0 + Wortlänge machst. Womit wird das Wort bei Index 2000 beim nächsten Schleifendurchlauf noch einmal "gefunden".


----------



## Fab1 (21. Feb 2012)

> Leider läuft sie bis zum Absturz und liefert auch kein richtiges Ergebnis.


Kommt eine Fehlermeldung?


```
start += word.length();
```
führt nicht zu dem gewünschten Ergebnis.

Grundgenommen würde ich die Sache so angehen. Du übergibst eine Zeile des Dokuments der Methode. Davon entfernst du alle Satzzeichen wie Komma Punkte Fragezeichen usw.. 
Diesen String splittest du mit der Methode split(" "); beim Leerzeichen somit erhälst du ein Array welche alle Wörter bzw. Zeichen enthält die mit Leerzeichen getrennt sind.
Nun prüfst du das Array mit einer For-Schleife oder auch mit der erweiterten For-Schleife, ob das von die Gesuchte Wort in dem Array von Wörtern vorkommt. Strings vergleicht man mit equals();

Wenn es vorkommt, dann einfach den Count inkrementieren.

Sollte so funktionieren.


----------



## xehpuk (21. Feb 2012)

Schau mal hier rein: http://www.java-forum.org/java-basi...hoden-haeufigkeit-einm-wort-zeichenkette.html

Du beachtest gar nicht den Index, an dem das Wort vorkommt. Daher kann es passieren, dass du ein Wort mehrmals zählst.

Die for-Schleife ist auch allgemein merkwürdig.


----------



## Landei (21. Feb 2012)

Der Algorithmus hat schon einen Denkfehler:

Angenommen das Wort is "abab", wie oft kommt es im Text "abababab" vor? So wie du die Sache angehst ([c]start += word.length();[/c]) kommt das Wort nur zweimal vor, aber ich denke, dreimal wäre hier "richtiger".


----------



## Martina (22. Feb 2012)

Danke für eure schnellen und tollen Antworten! 

Ja, den Denkfehler sehe ich jetzt auch. Jetzt weiß ich auch nicht mehr, was ich mir dabei gedacht habe *g*

In dem Link von xehpuk habe ich eine gute Funktion gefunden, die verständlich ist und funktioniert:

```
public static int countWords(String text, String word){
        int count=0;
        Pattern pat = Pattern.compile(Pattern.quote(word));
        Matcher m;
        for(m = pat.matcher(text); m.find(); count++);
        return count;
    }
```

Das tut genau das, was ich möchte.

Nochmal ganz lieben Dank für eure Hilfe!


----------



## truesoul (22. Feb 2012)

Hallo Martina. 

Aber wenn z.B das Wort "ein" in diesem Text gesucht wird:
"einmal einhundertundeins, bitte" 
bekommst du 3 als Ergebnis obwohl es nicht vorkommt.


----------



## Martina (22. Feb 2012)

Hallo truesoul,

das stimmt. Aber das kann man doch einfach umgehen, indem man beim zu zählenden Wort noch Leerzeichen davor und dahinter setzt, glaube ich:

```
public static int countWords(String text, String word){
        int count=0;
        Pattern pat = Pattern.compile(Pattern.quote(" " + word + " "));
        Matcher m;
        for(m = pat.matcher(text); m.find(); count++);
        return count;
    }
```


----------



## truesoul (22. Feb 2012)

Und was ist, wenn das gesuchte Wort am Anfang oder Ende steht? Da kommt bekanntlich kein leerzeichen.


----------



## Martina (22. Feb 2012)

Stimmt!
Eine sehr kurzsichtige Lösung von mir :-(

Wie wäre es damit:

```
public static int countWords(String text, String word){
        int count=0;
        Pattern pat = Pattern.compile("[^\w]" + Pattern.quote(word));
        Matcher m;
        for(m = pat.matcher(text); m.find(); count++);
        return count;
    }
```

Dann würde der Counter erhöht, wenn das Wort vokrommt und davor weder Buchstabe noch Zahl oder Unterstrich steht.


----------

