# String Wörter zählen



## JanDMC (9. Mrz 2009)

Hey Leute,

gibt es eine elegante Lösung, in einem String (z.b einen Artikel aus der Zeitung) alle Wörter zu zählen und in einer Collection mit häufigkeit abzuspeichern.

Ich habe an folgende Ansätze gedacht:

1)
Reguläre Ausdrücke

2)
StringTokenSizer

Ich würde zum abspeichern eine HashMap nehmen als Key das Wort und als Wert die Häufigkeit.
Gibt es noch bessere Ansätze, evtl mit mir nicht bekannten Modulen?

mfg

Jan


----------



## Der Müde Joe (9. Mrz 2009)

StringTokenizer ist eine Legacy Klasse und sollte nicht mehr benutzt werden.

Ad-hoc:
String#indexOf( str, start)
while-Schleife drum
Counter ++

EDIT:
ohh..sehe gerae ALLE Worte... dann wohl über ne Map (HashMap)
so ca
erstes Wort
in Map -> Wert++
nicht drin dann rein...

wie von dir beschrieben

(speziell  fällt mir sonst nichts ein)


----------



## hdi (9. Mrz 2009)

Hab das grad erst vor paar Tagen aus Spass gemacht.

*ACHTUNG:* 
- Keine Garantie auf eine "tolle" oder vollständige Lösung, war nur hingerotzt.
- Nur als Nachschlagewerkt/Hilfe gedacht. Ich will dir ja nich den Spass nehmen.
- Wenn du es selber machen willst, lies nicht weiter.

[HIGHLIGHT="Java"]import java.util.HashMap;
import java.util.Map;

public class WordCount {

	private Map<String, Integer> map;

	/**
	 * Analyzes a string, returning a map containing words within this string
	 * with their number of appearance.
	 * 
	 * @param src
	 *            the source string
	 * @return a map containing words within this string with their number of
	 *         appearance.
	 */
	public WordCount(String src) {

		map = new HashMap<String, Integer>();
		String regex = "[-.,;:!?(){} ]+";
		for (String w : src.split(regex)) {
			map.put(w.toLowerCase(), new Integer(map.containsKey(w
					.toLowerCase()) ? map.get(w.toLowerCase()) + 1 : 1));
		}
	}

	@Override
	public String toString() {
		StringBuilder sb = new StringBuilder();
		sb.append("WORD" + " - " + "POWER");
		sb.append("\n");
		for (String s : map.keySet()) {
			sb.append(s + " - " + map.get(s));
			sb.append("\n");
		}
		return sb.toString();
	}

	public static void main(String[] args) {

		String toAnalyze = "Hallo, ich bin ein Text! Toller Text, oder? Naja -- hallo, äh ich meine Tschüss ";
		WordCount wc = new WordCount(toAnalyze);
		System.out.println(wc);
	}

}[/HIGHLIGHT]


----------



## eliot (10. Mrz 2009)

JanDMC hat gesagt.:


> Hey Leute,
> 
> gibt es eine elegante Lösung, in einem String (z.b einen Artikel aus der Zeitung) alle Wörter zu zählen und in einer Collection mit häufigkeit abzuspeichern.
> 
> ...



Dem zweiten Ansatz würde ich mit einem "Daumen hoch" bewerten.


regards
eliot


----------



## Ebenius (10. Mrz 2009)

Ich würde reguläre Ausdrücke nehmen, allerdings das Beispiel von hdi abändern. 
nicht die split()-Methode zu verwenden (da die erst ein großes Array baut was keiner braucht), sondern Pattern und Matcher
keine HashMap mit lower-Case-Strings, da dann alle Strings kopiert werden müssen, sondern eine TreeMap mit Comparator (String.CASE_INSENSITIVE_COMPARATOR, wenn ich mich nicht irre)
Die Lösung mit regulären Ausdrücken würde ich deswegen vorziehen, weil "1.0" in einem Text weder ein noch zwei Worte sein sollen, und ich diese Fälle mit eim regulären Ausdruck besser ausgrenzen kann als mit einem StringTokenizer.

Ebenius


----------

