Sitzung: Jeden Freitag in der Vorlesungszeit ab 16 Uhr c. t. im MAR 0.005. In der vorlesungsfreien Zeit unregelmäßig (Jemensch da?). Macht mit!

Javakurs/Übungsaufgaben/Textwordcount/Musterloesung

Hinweis: Die Musterlösung kann von eurer Lösung abweichen, da es immer mehrere Varianten gibt ein Problem zu lösen. Im Zweifelsfall Fragt einen Tutor.

Lösung

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

/**
 * 
 * @author Jonas
 *
 */
public class TextWordCount {

	public static void main(String[] args) {
		String filename = "<your file name here>";

		String[] fileContent = EasyFileAccess.getFileContent(filename);

		// Eine Hashmap speichert Schlüssel-Wert-Paare. Hier wird für jedes Wort
		// gespeichert, wie oft es verwendet wurde.
		Map<String, Integer> words = new HashMap<String, Integer>();

		int totalWordCount = 0;

		for (String line : fileContent) {

			totalWordCount += line.split(" ").length;

			for (String word : line.split(" ")) {

				if (words.containsKey(word)) {
					// Das Wort ist bereits in der Hashmap enthalten, der gerade
					// hinterlegte Wert wird um eins erhöht und wieder in die
					// Hashmap geschrieben.
					words.put(word, words.get(word) + 1);
				} else {
					// Das Wort befindet sich noch nicht in der Hashmap und wird
					// neu hinzugefügt.
					words.put(word, 1);
				}

			}
		}

		System.out.println("Wortanzahl: " + totalWordCount);

		// Um nun die am häufigsten verwendeten Wörter zu ermitteln, muss etwas
		// getrickst werden. Klar ist, dass nach der Verwendungsanzahl
		// absteigend sortiert werden muss. Dies lässt sich mit einer Hashmap
		// allerdings nicht realisieren, da die Schlüssel-Wert-Paare unsortiert
		// gespeichert werden.
		// Deswegen wird an dieser Stelle eine Liste von Schlüssel-Wert-Paaren
		// angelegt, die im nächsten Schritt sortiert wird.

		List<Entry<String, Integer>> sortedList = new ArrayList<Entry<String, Integer>>(
				words.entrySet());

		// Sortiert wird mit einer Hilfsmethode aus der API. Dieser Methode kann ein "Comparator" übergeben werden, der zwei Objekte aus der Liste vergleicht.
		
		Collections.sort(sortedList, new Comparator<Entry<String, Integer>>() {
			@Override
			public int compare(Entry<String, Integer> o1,
					Entry<String, Integer> o2) {
				//Negatives Vorzeichen deswegen, da absteigend sortiert werden soll.
				return -o1.getValue().compareTo(o2.getValue());
			}
		});

		System.out.println("Am häufigsten verwendete Wörter: ");
		//Math.min für den Fall, dass weniger als 20 unterschiedliche Wörter verwendet wurden.
		for (int i = 0; i < Math.min(20, sortedList.size()); i++) {
			Entry<String, Integer> entry = sortedList.get(i);
			System.out.println(entry.getKey() + " (" + entry.getValue()
					+ " mal)");
		}

		System.out.println("Insgesamt wurden " + words.size()
				+ " unterschiedliche Wörter verwendet.");
	}

}

Kommentare

Wenn du Anmerkungen zur Aufgabe hast oder Lob und Kritik loswerden möchtest, ist hier die richtige Stelle dafür. Klicke einfach ganz rechts auf "bearbeiten" und schreibe deinen Kommentar direkt ins Wiki. Keine Scheu, es geht nichts kaputt ;)