{
"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()` erhöhst du bei einem bereits vorhandenen Wort den Zähler nicht (du schreibst den alten Wert wieder rein), dadurch werden Häufigkeiten nicht korrekt gezählt.\n- `topWord()` bestimmt nirgends, welches Wort die höchste Häufigkeit hat; selbst wenn gezählt würde, fehlt die Auswahl des Maximums.\n\n### Suggestion\n- Überlege dir in `topWord()`, wie du den gespeicherten Zählerwert für ein Wort um **1** erhöhen kannst, wenn es schon existiert.\n- Sobald deine Map korrekte Zählwerte enthält, brauchst du beim Durchlaufen eine Möglichkeit, dir „aktuelles Maximum“ (höchster Count) und das dazugehörige Wort zu merken und zu aktualisieren.\n- Prüfe, ob du das Zählen wirklich erst in `topWord()` machen willst, oder ob es einfacher ist, die Map bereits in `add(word)` aktuell zu halten (dann ist `topWord()` nur noch „Maximum suchen“).\n\n### Code Style\n- `import java.util.*;` ist sehr breit; importiere besser nur die Typen, die du wirklich verwendest.\n- `TreeMap<String, Integer> sortedWords` ist irreführend benannt: Eine `TreeMap` ist nach dem **Schlüssel** sortiert, nicht nach Häufigkeit; der Name suggeriert aber Sortierung nach Wortanzahl.\n- Du hältst sowohl `words` (Liste aller Wörter) als auch `sortedWords` (Zählstruktur). Das ist redundant und kostet bei großen Texten unnötig Speicher; entscheide dich für eine klare interne Datenstruktur.\n- `sortedWords` und `words` sollten als `private` gekapselt werden (internes Detail der Klasse).\n\n\n# Exercise: lotto\n\n### Correctness\n- `buyTicket`: Du prüfst nicht, ob nach der Ziehung noch Lose gekauft werden (es muss dann eine `IllegalStateException` kommen).\n- `buyTicket`: Deine Bereichsprüfung ist logisch falsch: `if ((number > maxNumber && number < 1))` kann nie `true` sein; dadurch werden Zahlen < 1 oder > maxNumber nicht korrekt abgefangen.\n- `buyTicket`: Du stellst nicht sicher, dass die 6 Zahlen alle **verschieden** sind (Dubletten müssen `IllegalArgumentException` auslösen).\n- `buyTicket`: Du erhöhst `soldTickets` nie; dadurch bleibt `getSoldTickets()` falsch und die ID-Vergabe ist nicht “1,2,3,…” über mehrere Tickets hinweg abgesichert.\n- `draw`: Du verhinderst nicht, dass `draw()` ein zweites Mal aufgerufen wird. Stattdessen prüfst du innerhalb der Schleife etwas gegen `winningNumbers`, aber du wirfst nicht generell sofort, wenn bereits gezogen wurde.\n- `draw`/`getWinningNumber`: Du ziehst Zufallszahlen nur von 1 bis 6 (`Math.random()*6+1`) statt von 1 bis `maxNumber`.\n- `Ticket.getNumbers()`: Du gibst das interne `numbers`-Array direkt zurück; gefordert ist eine **Kopie**, damit der Client die Ticketzahlen nicht nachträglich verändern kann.\n\n### Suggestion\n- Für den “Zustand” der Lotterie: Überlege dir, welche Methoden vor/nach `draw()` erlaubt sind, und mache am Anfang von `buyTicket()` bzw. `draw()` jeweils eine klare Zustandsprüfung (statt irgendwo in der Mitte).\n- Für die Bereichsprüfung in `buyTicket()`: Formuliere die Bedingung so, dass sie “kleiner als 1 **oder** größer als maxNumber” abdeckt (nicht mit `&&`).\n- Für “6 verschiedene Zahlen”: Nutze eine Collection (z.B. `HashSet`) beim Validieren und vergleiche, ob wirklich 6 verschiedene Werte zusammenkommen bzw. ob ein Wert schon gesehen wurde.\n- Für Ticket-IDs und `soldTickets`: Den Zähler musst du beim erfolgreichen Verkauf aktualisieren; die Ticket-ID sollte aus diesem aktualisierten Stand kommen.\n- Für das Ziehen: Verwende beim Zufallsbereich `maxNumber` (nicht 6) und stelle sicher, dass du so lange ziehst, bis du 6 verschiedene Zahlen hast.\n- Für `getNumbers()`: Gib ein neues Array zurück (z.B. Kopie des gespeicherten Arrays), nicht die interne Referenz.\n\n### Code Style\n- Unnötige `System.out.println(...)` Debug-Ausgaben in `draw()` (das stört Tests/Output und gehört nicht in die finale Lösung).\n- Unbenutzte Imports: In `Lottery` ist `java.util.Collection` importiert, aber wird nicht verwendet.\n- `getWinningNumber` ist rekursiv; das funktioniert zwar oft, ist aber für so etwas unnötig kompliziert und kann man einfacher iterativ lösen (und dann auch leichter korrekt auf `maxNumber` parametrieren).\n",
"status" : "SUCCESS"
},
"unitTest" : {
"tests" : [ {
"name" : "buyTicketIds()",
"status" : "FAILED",
"message" : "expected: <2> but was: <1>"
}, {
"name" : "buyTicketsIllegalNumbers()",
"status" : "FAILED",
"message" : "Expected java.lang.Exception to be thrown, but nothing was thrown."
}, {
"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" : "PASSED",
"message" : null
}, {
"name" : "getWinningNumbersNotDrawnYet()",
"status" : "PASSED",
"message" : null
}, {
"name" : "buyTicketAlreadyDrawn()",
"status" : "FAILED",
"message" : "Expected java.lang.Exception to be thrown, but nothing was thrown."
} ]
}
}