Zählen von Wörtern in einer Zeichenkette?

6 Antworten

Naja, Du schaust ja immer wieder nur ob s g enthält. Du willst aber doch eigentlich schauen wie oft g in s enthalten ist.

Ich denke so müsste es gehen:

for (int i = 0; i <= s.length() - g.length(); i++) {
  if (s.substring(i, i + g.length()).equals(g)) {
    counter++;
  }
}

Mal visualisiert:

s = Halloallo (Länge 9)
g = lo        (Länge 2)
9 - 2 = 7, Schleife läuft also von 0 bis 7.

i=0: |Ha|lloallo
i=1: H|al|loallo
i=2: Ha|ll|oallo 
i=3: Hal|lo|allo -> match, also counter++
i=4: Hall|oa|llo
i=5: Hallo|al|lo
i=6: Halloa|ll|o
i=7: Halloal|lo| -> match, also counter++

Falls überlappende Vorkommen nicht mitgezählt werden sollen (s="aaaa", g="aa" wäre dann 2 anstatt 3) ginge es auch einfacher, mit etwas Mathematik:

return (s.length() - s.replace(g, "").length()) / g.length();

oder noch kürzer:

return s.split(g, -1).length - 1;
Woher ich das weiß:Hobby – Programmieren ist mein Hobby & Beruf
Maylaba 
Fragesteller
 12.05.2023, 06:23

Dankeschön das hilft mir sehr:)

1
MrAmazing2  12.05.2023, 08:57
@Maylaba

Bitteschön :)

Aber ich denke ich habe die Aufgabe wohl falsch verstanden. Mein Code zählt, wie man an meinem Beispiel sieht, keine Wörter, sondern einfach generell wie oft eine Zeichenkette in einer anderen vorkommt. Wenn du wirklich Wörter in einem Satz zählen möchtest ist die Lösung von QLQuadratAchtel die einzig richtige.

0

ich erspare mir mal den einlesequatch

nur die ganzen uhu zählen:

String g = "uhufeder uhu esel uhu huhutle";
String s = "uhu";
Pattern pattern = Pattern.compile("\\b"+s+"\\b");  //suchwort innerhalb  beliebiger wortbegrenzer (nur  ganze  Wörter finden)
Matcher matcher = pattern.matcher(g);

//java 9:
int count=matcher.results().count();

//bisJava 8:
int count = 0;
while (matcher.find()) {
    count++;
}

System.out.println(count);  

Ja, deine Schleife ist auch irgendwie seeehr merkwürdig. Du gehst in jedem Durchlauf so viele Buchstaben weiter, wie das gesuchte Wort lang ist und prüfst dann in jedem Durchlauf, ob das Wort irgendwo im String s vorkommt.

In deinem Beispiel ist der String 23 Zeichen lang und das gesuchte Wort ist 3 Zeichen lang. Es wird also insgesamt 8 Mal in dem Satz gesucht. Da das gesuchte Wort in dem Satz vorkommt, wird der Zähler jedes Mal um Eins erhöht und das Ergebnis ist 8.

Ich würde die Aufgabe am ehesten reguläre Ausdrücke benutzen:

ublic static int wordCount(String text, String search) {
    return (int) Pattern
        .compile(Pattern.quote(search))
        .matcher(text)
        .results()
        .count();
}
Von Experten Erzesel und MrAmazing2 bestätigt

Wieso machst du die Schleife so kompliziert? Lass den eingegeben Satz in einem Array oder Liste speichern, aufsplitten und anschließend durchloopen, ob g in s vorhanden ist, wenn ja, steigt der Zähler-Counter um 1 hoch.

String[] woerter = s.split(" ");
        int zaehler = 0;
        for (String w : woerter) {
            if (w.equals(g)) {
                zaehler++;
            }
MrAmazing2  12.05.2023, 08:55

Stimmt, wenns wirklich um Wörter in einem Satz geht sollte man das so machen. Ich glaube aufgrund seiner vorherigen Frage dachten wir alle, dass es darum geht, Substrings in einem String zu zählen.

1
Erzesel  12.05.2023, 13:47

für einen einfachen Satz ohne kommas etc. ok. Bequemer/einfacher gehts mit regex, es gibt ja auch andere Zeichen, welche Wörter begrenzen können ein split an " " würde keien .;,?! .etc berücksichtigen. \bmeinwort\b findet nur ganze Worte, egal welche Zeichen drumrum sind

1
QLQuadratAchtel  12.05.2023, 14:13
@Erzesel

Ich hab es eben nochmal nachgeschlagen, da ich mich nur flüchtig mit Regex auseinandergesetzt habe. Ich wusste gar nicht, dass es mittels Metacharacters doch so einfach ist, danke! :D Wieder etwas gelernt.

1