import java.util.*; public class Stats { public static void main(String[] args) { // Textstatistik // Eine LinkedList ist auch eine List // List ist dabei eine abstrakte Beschreibung, wie eine // List auszusehen hat (sprich man kann keine List direkt erstellen // sondern nur LinkedList und ArrayList, aber dazu naechste Woche). List text = new LinkedList(); Scanner sc = new Scanner(System.in); while(sc.hasNext()) { text.add(sc.next()); } System.out.printf("Es wurden %d Woerter eingegeben\n", text.size()); // Aber wieviele unterschiedliche Woerter wurden eingegeben? // In der Mathematik gibt es Mengen, bei denen ein Element // drinnen ist oder nicht, aber nicht mehrfach drinnen ist. // Auf Englisch Set // Set ist selbst eine abstrakte Beschreibung (=Interface) von // Mengen, konkret gibt es HashSet [benoetigt die Methode int hashCode()] // und TreeSet (die wiederum auch eine SortedSet ist) [benoetigt einen // Vergleichsoperator, wie er bei String und Zahlen vorkommt] Set set = new TreeSet(); set.addAll(text); // Fuege den ganzen Text ein // und: System.out.printf("Es wurden %d unterschiedliche Woerter eingegeben\n", set.size()); System.out.println("Diese lauten"); for(String s : set) { System.out.println(s); } // Man sieht warum TreeSet auch SortedSet sind. // Assoziative Arrays werden in PHP und Perl verwendet und sind // Arrays mit beliebigem Index-Typen. // Z.B. arr["Hello"] = 5; ist in perl und PHP moeglich. // In Java geht das mit Maps. Index = Key, Wert = Value. // Aufgabe: Wie oft kommt welcher Buchstabe vor? Gross/Kleinscheibung // soll ignoriert werden, genauso wie Satzzeichen. // Wir wollen eine Map: arr[Buchstabe] = Anzahl vorkommen // Nachdem int und char keine Objekte sind nehmen wir die Wrapper-Klassen // Bei Maps gibts auch HashMaps und TreeMaps. TreeMaps machen alles schoen // in alphabetischer Reihenfolge. Map count = new TreeMap(); int nrChar = 0; // Wieviele Buchstaben? for(String s : text) { for(int i = 0; i < s.length(); i++) { char ch = s.charAt(i); ch = Character.toUpperCase(ch); // Wenns im Bereich A-Z ist, zaehlen wir ihn if('A' <= ch && ch <= 'Z') { // in Perl/PHP waere es jetzt einfach count[ch] ++; if(count.containsKey(ch)) { // In java muss mans ausschreiben: // count[ch] = count[ch] + 1; // entspricht dabei count.put(ch, count.get(ch) + 1); } else { // Erstes Vorkommen count.put(ch, 1); } nrChar ++; } } } // Und Ausgabe einer Statistik for(char ch : count.keySet()) { double d = count.get(ch); d /= nrChar; System.out.printf("%s\t\t%.2f\n", ch, d * 100); } } }