Übungsaufgabe zur Veranstaltung Programmieren 2 im Bachelorstudiengang Wirtschaftsinformatik an der Hochschule Rosenheim.
In dieser Übung verwenden Sie die Interfaces List<T>
, Set<T>
, Map<K, V>
sowie das inner Interface Map.Entry<K, V>
, welche alle in java.util
eingeordnet sind.
Mit Hilfe von Iterator<T>
, welcher von Containerklassen bereit gestellt wird, die Iterable<T>
implementieren (z.B. LinkedList<T>
, TreeSet<T>
), berechnen Sie Statistiken über Tweets, am Beispiel einer prominenten Person.
Zunächst werden nach und nach Tweets (String
s) indiziert, um auszuzählen, welches Wort wie oft vorkommt.
Aufbauend auf dieser Statistik werden nun Iteratoren erstellt, um über
- das gesamte Vokabular (alphabetisch),
- die häufigsten Hashtags (absteigend,
#...
), - die häufigsten Wörter (absteigend, quasi Buzzwords) zu iterieren.
In einem letzten Schritt wird ein Iterator erstellt, welcher über alle Tweets iteriert, absteigend sortiert nach "Buzzwordgewicht".
Von technischer Seite ist das Interface TweetSammlung
zu implementieren, sowie die Factorymethode TweetSammlung.create
.
- In der offiziellen Javadokumentation finden Sie für jede der Interfaces (z.B.
List<T>
) eine Auflistung der implementierenden Klassen (z.B.LinkedList<T>
undArrayList<T>
, uvm.). - Es bildet ungemein, sich auch die Javadoc zu anderen Methoden und Interfaces durchzulesen welche verwendet werden.
- In dieser Uebung müssen Sie keinen (!) eigenen Iterator implementieren; vielmehr legen Sie Datenstrukturen an, welche Sie sortieren und filtern, und beim Ergebnis
.iterator()
aufrufen.
Erstellen Sie eine neue Klasse, welche TweetSammlung
implementiert, und ändern Sie die statische Factorymethode TweetSammlung.create
so, dass eine neue Instanz dieser Klasse zurückgegeben wird.
Implementieren Sie die Methode ingest(String tweet)
.
Diese Methode nimmt einen String entgegen, welcher mit der statischen Methode TweetSammlung.tokenize(String)
in eine List<String>
umgewandelt werden kann.
Der originale Tweet soll in einer Liste (List<String>
) abgelegt werden.
Für jedes Wort soll ein Zähler unterhalten werden, wie oft ein Wort bereits insgesamt vorgekommen ist.
Diese Methoden werden Sie ausserdem brauchen:
List<T>.add(T e)
: hängt ein Element an eine Liste anMap<K, V>.get(K key)
: gibt den Wert für einen Schlüssel zurück, odernull
Map<K, V>.containsKey(K key)
: gibt an, ob es für einen Schlüssel einen Wert gibtMap<K, V>.put(K key, V val)
: setzt den Wert (val
) für einen Schlüssel (key
)
Implementieren Sie die folgenden Methoden:
Iterator<String> vocabIterator()
: Gibt einen Iterator über alle Wörter zurück, alphabetisch sortiert. Hinweis: Verwenden SieMap.keySet()
und lesen Sie die Dokumentation dazu.Iterator<String> topHashTags()
: Gibt einen Iterator über alle HashTags, also Wörter welche mit#
beginnen, zurück, absteigend sortiert nach Häufigkeit. Hinweis: Je nach Implementierung benötigen Sie eine "Hilfsliste"; um Wörter und deren Häufigkeit in einer solchen Liste zu speichern verwenden Sie z.B. die Klasseorg.apache.commons.lang3.tuple.Pair
(via FactorymethodePair.of()
).Iterator<String> topWords()
: Gibt einen Iterator über alle die Wörter zurück, deren erster Buchstabe alphabetisch ist (sieheCharacter.isAlphabetic
), ebenfalls absteigend nach Wichtigkeit.
Diese Methoden werden Sie außerdem brauchen:
List<T>.sort(Comparator<T> c)
: Sortiert eine Liste mit gegebenemComparator
.- Das Interface
Map.Entry<K, V>
, welches einen Schlüssel (.getKey()
) und einen Wert (.getValue()
) enthält; siehe auchMap.entrySet()
. Pair.getLeft()
undPair.getRight
: Gibt das linke bzw. rechte Element eines Datenpaares zurück;Pair<K, V>
implementiertMap.Entry<K, V>
.
Implementieren Sie die Methode Iterator<Pair<String, Integer>> topTweets()
, welche einen Iterator zurückgibt, welcher über Paare von Tweets und "Buzzwordlastigkeit" (Pair<String, Integer>
), absteigend nach Buzzwordlastigkeit sortiert, iteriert.
Die Buzzwordlastigkeit eines Tweets ist die Summe der Häufigkeiten der Wörter.
Hinweis: Je nach Implementierung müssen Sie hier wieder eine Hilfsliste erstellen, welche zunächst Paare von Tweet und Buzzwordlastigkeit, also Pair<String, Integer>
enthält, welche dann entsprechend sortiert wird.
Wie Sie den Testausgaben entnehmen können, treten Allerweltswörter wie "so" oder "and" in den Vordergrund, obwohl diese offensichtlich unwichtig sind.
Implementieren Sie die Methode setStopwords(File)
, welche mit einem java.util.Scanner
zu ignorierende Wörter aus einer Datei liest (siehe java.io.FileReader
).
Lesen Sie dazu Wort für Wort in ein separates Set<String>
, und passen Sie anschließend die Methoden ingest
und topTweets
an, so dass Wörter, welche im Stopwordset enthalten sind, ignoriert werden.
Verwenden Sie dazu die Methode Set<T>.contains(T e)
.