{
"llm" : {
"feedback" : "# Exercise: textanalysis\n\n### Correctness\n- `topWord()` gibt bei leerer Datenstruktur (`add` wurde nie aufgerufen) `null` zurück; gefordert ist ein `String` als Rückgabewert, und das Testprogramm gibt das Ergebnis in Anführungszeichen aus, wodurch dann `\"null\"` erscheinen würde.\n\n### Suggestion\n- Überlege dir, welchen Rückgabewert `topWord()` liefern soll, wenn noch kein Wort hinzugefügt wurde (z.B. leerer String oder ein anderer definierter Default), und initialisiere/handle deinen „Gewinner“-Wert entsprechend.\n\n### Code Style\n- Mach `counts` `private` (Kapselung), damit externe Klassen die interne Datenstruktur nicht direkt verändern können.\n- In `add` rufst du `counts.get(word)` mehrfach auf; speichere den Wert einmal zwischen, um es lesbarer zu machen und doppelte Map-Zugriffe zu vermeiden.\n- Du kannst die Iteration etwas lesbarer machen (z.B. mit einer for-each-Schleife über `keySet()` oder `entrySet()`), statt manuell einen `Iterator` zu verwenden.\n\n\n# Exercise: lotto\n\n### Correctness\n- In `buyTicket` erstellst du das Ticket mit `new Ticket(null, soldTickets, numbers)`: Das Ticket muss eine Referenz auf genau diese `Lottery` haben, sonst können `getCorrectNumbers()`/`getPrize()` später nicht über die Lotterie auf die Gewinnzahlen zugreifen.\n- In `Ticket` fehlt die geforderte Instanzvariable zum Speichern der 6 Zahlen; der Konstruktor speichert die Zahlen aktuell nirgends.\n- `Ticket.getNumbers()` ist nicht implementiert und liefert `null` statt der 6 Ticketzahlen (als Kopie).\n- `Ticket.getCorrectNumbers()` ist nicht implementiert und liefert `null`; zudem muss die Methode vor der Ziehung eine `IllegalStateException` auslösen.\n- `Ticket.getPrize()` ist nicht implementiert und liefert immer `0`; zudem muss die Methode vor der Ziehung eine `IllegalStateException` auslösen und danach den Gewinn gemäss Vorgabe berechnen.\n\n### Suggestion\n- Überlege dir, wie ein `Ticket` später an die gezogenen Gewinnzahlen kommt: Welche Referenz muss im Ticket gespeichert sein, und welches Objekt steht dir in `buyTicket` dafür zur Verfügung?\n- Entscheide dich für eine Collection als Instanzvariable im `Ticket`, in der du die 6 Zahlen speicherst (z. B. so, dass „6 verschiedene“ gut abbildbar ist), und fülle sie im Konstruktor aus dem `numbers`-Array.\n- `getNumbers()` soll keine interne Struktur „nach aussen“ geben, sondern eine Kopie zurückliefern; schau dir an, wie man aus einer Collection wieder ein `Integer[]` erzeugt.\n- Für `getCorrectNumbers()`: du brauchst die Schnittmenge aus „Ticketzahlen“ und „Gewinnzahlen“; beachte dabei, dass `Lottery.getWinningNumbers()` vor der Ziehung bereits die passende Exception wirft.\n- Für `getPrize()`: nimm die Anzahl korrekter Zahlen als Basis und baue daraus den Gewinn nach der Regel „bei 1 Zahl = 5, jede weitere *20“; teste gedanklich die Fälle 0, 1, 2 und 6 Richtige.\n\n### Code Style\n- `Random random = new Random();` sollte als `private final Random random = new Random();` gekapselt werden (nicht package-visible), und üblicherweise steht es bei den anderen Feldern oben.\n- In `buyTicket` hast du sehr lange (teilweise doppelte) Kommentare/JavaDoc (Deutsch + Englisch) – halte es eher einmalig und knapp, damit es wartbar bleibt.\n",
"status" : "SUCCESS"
},
"unitTest" : {
"tests" : [ {
"name" : "buyTicketIds()",
"status" : "PASSED",
"message" : null
}, {
"name" : "buyTicketsIllegalNumbers()",
"status" : "PASSED",
"message" : null
}, {
"name" : "draw()",
"status" : "PASSED",
"message" : null
}, {
"name" : "drawNoDuplicates()",
"status" : "PASSED",
"message" : null
}, {
"name" : "drawRandom()",
"status" : "PASSED",
"message" : null
}, {
"name" : "drawAlreadyDrawn()",
"status" : "PASSED",
"message" : null
}, {
"name" : "getWinningNumbersNotDrawnYet()",
"status" : "PASSED",
"message" : null
}, {
"name" : "buyTicketAlreadyDrawn()",
"status" : "PASSED",
"message" : null
} ]
}
}