faecher:informatik:oberstufe:java:aoc:aco2023:day7:start

Hilfestellung Teil 1

Die Aufgabe ist schwierig zu beschreiben und entsprechend sind die hier gelisteten Tipps möglicherweise nur eingeschränkt hilfreich.

  • Es ist sinnvoll, die Karten nach zwei Schemas zu sortieren. Einmal nach der Kartentyp (5 identisch, 4 identisch, etc.) und dann pro Typ noch nach dem Wert der einzelnen Karten (A, K, Q, …).
  • Ein möglicher Datentyp, um all diese Dinge zu berücksichtigen, ist eine ArrayList<ArrayList<String[]> >. Was ist damit gemeint? Die äußere ArrayList enthält insgesamt 7 ArrayLists, welche jeweils alle Karten nach Kartentyp sortiert enthalten. Die erste innere ArrayList enthält also z. B. alle Karten, bei denen alle 5 identisch sind, etc. Pro innerer ArrayList wird ein String-Array gespeichert. Dieses stellt die beiden String-Bestandteile jeder Zeile dar. Dadurch ist gewährleistet, dass der Kartenwert jeder Karte immer fest zugeordnet ist und auffindbar bleibt (auch nach Umsortierungen).
  • Die inneren String-Arrays können als erstes erstellt werden.
  • Pro String-Array muss nun der Typ der Karte ermittelt werden und das String-Array der passenden ArrayList zugefügt werden.
  • Am Ende muss man alle eingetragenen ArrayLists in der richtigen Reihenfolge durchlaufen, die String-Arrays pro ArrayList korrekt sortieren und alle Werte zusammenrechnen.
  • Für die korrekte Sortierung wird man wiederum vermutlich nicht herumkommen einen eigenen Comparator zu erstellen, mit dem man eine eigene/neue Sortierreihenfolge erzwingen kann.

Dieser nachfolgende Lösungsvorschlag ist an einzelnen Stellen nicht besonders schön programmiert. Funktionieren tut er dennoch.

Lösungsvorschlag

Hilfestellung Teil 2

Für Teil 2 benötigt man an zwei Stellen kleinere Anpassungen.

  1. Bei der Erfassung der Types muss anders vorgegangen werden. Man kann die Methode getType() so umprogrammieren, dass sie nun die Joker J zunächst bewusst ignoriert. Anschließend nimmt man den errechneten Karten-Typ und korrigiert ihn pro vorhandenen Joker 'nach oben'. Beispiel: 4JJKQ wird zunächst exklusive der zwei J als 'High Card' klassifiziert. Nimmt man im ersten Durchlauf einen Joker hinzu, so muss aus einer 'High Card' immer Päärchen werden. Nimmt man im zweiten Durchlauf den zweiten Joker hinzu, so muss aus einem Päärchen ein Drilling werden. Das ist damit die finale Kategorie dieser Karte.
  2. Der Comparator muss minimal umgeschrieben werden, indem man die Reihenfolge der Zeichen ändert.

Lösungsvorschlag

Variante 2: Objekte

Variante zwei wieder mit Objekten:

Wie bei den Sortieralgorithmen hier erläutert, kann man bei Java-Klassen das "Comparable"-Interface implementieren, damit ist es möglich, in der Methode compareTo eigene Regeln festzulegen, nach denen die Objekte dieser Klasse sortiert werden sollen. Genau das benötigen wir hier:

  • Wir erzeugen für jede Zeile in der Eingabe ein Hand-Objekt, für den wir den Typ bestimmen und in einem Attribut ablegen.
  • Dann wollen wir die Objekte sortieren - allerdings reicht der Vergleich der Typen nicht aus, weil man bei zwei "Hands" desselben Typs die einzelnen Karten vergleichen soll.
  • Also implementieren wir in der Klasse Hand die Methode compareTo, die genau das macht.

Die Lösung für Teil 1 und Teil 2 findet sich im selben Code, ich habe versucht das verständlich zu kommentieren. Wenn du nicht viel Programmiererfahrung hast, musst du wahrscheinlich auch an anderer Stelle noch nachlesen:

  • faecher/informatik/oberstufe/java/aoc/aco2023/day7/start.txt
  • Zuletzt geändert: 07.12.2023 20:43
  • von Frank Schiebel