{
"llm" : {
"feedback" : "# Exercise: textanalysis\n\n### Correctness\n- `topWord()` liefert immer `\"\"` zurück und damit nicht das am häufigsten vorkommende Wort.\n- In `topWord()` wird die Häufigkeit bei bereits vorhandenen Wörtern nicht erhöht (du schreibst den bestehenden Wert wieder zurück), dadurch werden Counts nicht korrekt gezählt.\n- `topWord()` ermittelt aktuell gar kein “Top”-Wort aus den gezählten Häufigkeiten (kein Vergleich/keine Auswahl des Maximums).\n\n### Suggestion\n- Überlege dir für den Fall “Wort existiert schon”: Wie kommst du vom bisherigen Zählerstand auf den neuen? (Stichwort: bisherigen Wert holen und um 1 erhöhen).\n- Nachdem du eine Map mit Häufigkeiten hast: Iteriere über die Einträge und merke dir währenddessen das Wort mit der größten Zahl (ein “aktuelles Bestes” + “bester Zähler”).\n- Prüfe, ob du das Zählen wirklich erst in `topWord()` machen willst, oder ob es einfacher ist, beim `add()` direkt die Map aktuell zu halten. Dann muss `topWord()` nur noch auswerten.\n\n### Code Style\n- `sortedWords` ist als `TreeMap` benannt/gedacht “sorted”, aber fürs Häufigkeitszählen ist die Sortierung nach Schlüssel nicht nötig; benenne die Struktur eher nach ihrer Aufgabe (z.B. `counts`) und wähle den Typ nach Bedarf.\n- Du hältst sowohl `words` (Liste aller Wörter) als auch `sortedWords` (Counts). Das doppelt Speicher und Arbeit; entscheide dich nach Möglichkeit für eine Datenstruktur, die du konsequent nutzt.\n- Felder (`sortedWords`, `words`) sollten i.d.R. `private` sein, damit die Klasse ihre Invarianten selbst kontrolliert.\n\n\n# Exercise: lotto\n\n### Correctness\n- In `Lottery.buyTicket` fehlt die Zustandsprüfung: Nach `draw()` dürfen keine Tickets mehr gekauft werden (es muss dann eine `IllegalStateException` kommen).\n- In `Lottery.buyTicket` ist die Bereichsprüfung der Zahlen logisch falsch: Mit `number > maxNumber && number < 1` kann die Bedingung nie true werden, dadurch werden ungültige Zahlen nicht abgefangen.\n- In `Lottery.buyTicket` prüfst du nicht, ob alle 6 Zahlen **verschieden** sind (Duplikate müssen eine `IllegalArgumentException` auslösen).\n- In `Lottery.buyTicket` wird `soldTickets` nie erhöht; dadurch bleibt `getSoldTickets()` falsch und IDs werden nicht fortlaufend verwaltet.\n- In `Lottery.draw` fehlt die Zustandsprüfung “draw darf nur einmal passieren”: Wenn schon gezogen wurde (`winningNumbers != null`), muss sofort eine `IllegalStateException` kommen (nicht erst während der Ziehung).\n- In `Lottery.draw` werden die Gewinnzahlen nur im Bereich 1..6 gezogen (`Math.random() * 6 + 1`) statt 1..`maxNumber`.\n- In `Ticket.getNumbers` gibst du das interne Array direkt zurück; laut Aufgabe muss eine **Kopie** zurückgegeben werden, damit Client-Code die Ticketzahlen nicht nachträglich verändern kann.\n\n### Suggestion\n- Für `buyTicket`: Überlege dir am Anfang der Methode, ob die Lotterie schon gezogen hat (`hasDrawn()`), und entscheide dann sofort, ob der Aufruf überhaupt erlaubt ist.\n- Für die Bereichsprüfung: Formuliere die Bedingung so, dass sie für “kleiner als 1 **oder** grösser als maxNumber” greift (nicht “und”).\n- Für die Einzigartigkeit der 6 Zahlen: Eine `Set`-Struktur hilft dir dabei, Duplikate beim Prüfen zuverlässig zu erkennen (wenn etwas schon drin ist, ist es ein Duplikat).\n- Für Ticket-IDs / `soldTickets`: Die ID soll aus einem Zähler kommen, der bei jedem Verkauf weiterläuft; prüfe, an welcher Stelle du inkrementieren musst, damit Ticket 1 wirklich ID 1 hat und `getSoldTickets()` stimmt.\n- Für `draw`: Prüfe zu Beginn, ob `winningNumbers` bereits gesetzt ist, und brich dann direkt ab. Für die Zufallszahlen: Die zufällige Zahl muss sich an `maxNumber` orientieren, nicht fix an 6.\n- Für `getNumbers`: Gib ein neues Array zurück, das die aktuellen Ticket-Zahlen kopiert (damit Änderungen am Rückgabewert nicht dein Ticket verändern).\n\n### Code Style\n- In `Lottery.draw` sind `System.out.println(...)` Debug-Ausgaben drin; die sollten in der finalen Lösung weg, sonst “verschmutzen” sie die Programmausgabe/Tests.\n- In `Lottery` ist der Import `java.util.Collection` unbenutzt.\n- In `Ticket` sind `HashSet` importiert aber nicht verwendet; ausserdem könntest du dich für **eine** passende Collection-Struktur entscheiden (aktuell mischst du Array + ArrayList im Gebrauch), das macht den Code schwerer nachvollziehbar.\n",
"status" : "SUCCESS"
},
"unitTest" : {
"tests" : [ {
"name" : "buyTicketIds()",
"status" : "FAILED",
"message" : null
}, {
"name" : "buyTicketsIllegalNumbers()",
"status" : "PASSED",
"message" : null
}, {
"name" : "draw()",
"status" : "PASSED",
"message" : null
}, {
"name" : "drawNoDuplicates()",
"status" : "PASSED",
"message" : null
}, {
"name" : "drawRandom()",
"status" : "FAILED",
"message" : "Number 7 never drawn. Does not seem to be random. ==> expected: <true> but was: <false>"
}, {
"name" : "drawAlreadyDrawn()",
"status" : "FAILED",
"message" : "Unexpected exception type thrown, expected: <java.lang.IllegalStateException> but was: <java.lang.reflect.UndeclaredThrowableException>"
}, {
"name" : "getWinningNumbersNotDrawnYet()",
"status" : "FAILED",
"message" : "Unexpected exception type thrown, expected: <java.lang.IllegalStateException> but was: <java.lang.reflect.UndeclaredThrowableException>"
}, {
"name" : "buyTicketAlreadyDrawn()",
"status" : "FAILED",
"message" : null
} ]
}
}