Beide Seiten, vorherige Überarbeitung Vorherige Überarbeitung Nächste Überarbeitung | Vorherige Überarbeitung |
faecher:informatik:oberstufe:java:aoc:einfuehrung:start [24.11.2023 10:56] – Frank Schiebel | faecher:informatik:oberstufe:java:aoc:einfuehrung:start [24.11.2023 15:20] (aktuell) – Frank Schiebel |
---|
| ~~NOTOC~~ |
| |
====== Einführung ====== | ====== Einführung ====== |
| |
Die Situation in BlueJ sieht dann so aus: | Die Situation in BlueJ sieht dann so aus: |
| |
{{ :faecher:informatik:oberstufe:java:aoc:aoc2021:einfuehrung:auswahl_012.png |}} | {{ :faecher:informatik:oberstufe:java:aoc:einfuehrung:2023-11-24_16-09.png |}} |
| |
Wenn der AOC voranschreitet, kann das dann evtl. auch irgendwann so (oder so ähnlich) aussehen: | Wenn der AOC voranschreitet, kann das dann evtl. auch irgendwann so (oder so ähnlich) aussehen: |
===== Tipp: Verwendung der AOC-Beispiele ===== | ===== Tipp: Verwendung der AOC-Beispiele ===== |
| |
Im "Aufgabentext" der AOC Aufgaben wird die Problemstellung ausführlich anhand eines Beispiels erläutert. Es ist meist eine gute Idee, die Lösung anhand dieses meist überschaubaren Beispiels zu implementieren, weil man hier sein eigenes Vorgehen besser nachvollziehen kann. | Im "Aufgabentext" der AOC Aufgaben wird die Problemstellung ausführlich anhand eines //Beispiels// erläutert. Es ist meist eine gute Idee, die Lösung anhand dieses meist überschaubaren Beispiels zu implementieren, weil man hier sein eigenes Vorgehen besser nachvollziehen kann. Dazu muss man die Beispieleingabe als Datei ablegen und kann dann mit programmieren loslegen. |
| |
<WRAP center round tip 90%> | <WRAP center round tip 97%> |
**Wichtig:** Man sollte unbedingt einen Blick in den "echten" Puzzle-Input werfen, um nicht mit falschen Voraussetzungen zu denken und zu programmieren, denn oft ist dieser zwar ähnlich hat aber mehr Zeilen, mehr Stellen, größere Koordinatenwerte u.ä. als das Beispiel. | **Wichtig:** Man sollte unbedingt einen Blick in den "echten" Puzzle-Input werfen, um nicht mit falschen Voraussetzungen zu denken und zu programmieren, denn oft ist dieser zwar ähnlich hat aber mehr Zeilen, mehr Stellen, größere Koordinatenwerte u.ä. als das Beispiel. |
</WRAP> | </WRAP> |
===== Das Eingabeformat der Vorlage ===== | ===== Das Eingabeformat der Vorlage ===== |
| |
Die Methdode ''readInput(String filename, char Separator)'' liest die Daten aus der Eingabedatei in eine ArrayList von String-Arrays ein. | Die Methdode ''readInput(String filename)'' liest die Daten aus der Eingabedatei zeilenweise in eine ArrayList von String-Arrays ein. Leere Zeilen werden dabei als leerer String eingelesen. |
| |
Man kann beim Aufruf der Methode das Trennzeichen angeben, an dem die Felder des Arrays getrennt werden. | |
| |
==== Beispiel 1 - Jede Zeile hat einen Wert: ==== | ===== Die Sache mit den Zahlen ===== |
| Wie in obigen Beispiel zu sehen, ist die Eingabe zunächst ein Array von Strings, was ungünstig ist, wenn man mit den Werten rechnen möchte/muss. Um aus den Strings Integer-Werte zu machen, verwendet man ''Integer.parseInt(String)'': |
<code> | <code java> |
199 | for (String[] line: input) { |
200 | // line ist ein Array der Länge 2 |
208 | //String ersteZahl = line[0]); |
| int ersteZahl = Integer.parseInt(line[0]) |
| // String zweiteZahl = line[1]); |
| int zweiteZahl = Integer.parseInt(line[1]) |
| // ... rechne wat ... |
| } |
</code> | </code> |
Man trennt die Array-Felder am Newline-Zeichen ''\n'': ''readInput(inputFile, '\n')'' | |
| |
Das Ergebnis sieht dann so aus: | |
| |
{{ :faecher:informatik:oberstufe:java:aoc:aoc2021:einfuehrung:arraylist01.png |}} | ===== Das Beispiel aus AOC 2022 in der BlueJ-Vorlage ===== |
| |
Die Zahlen ausgeben kann folgendermaßen: | |
| |
<code java> | Die BlueJ-Vorlage kommt mit einem Beispiel aus AOC 2022: |
for (String[] line: input) { | |
// line ist ein Array der Länge 1 mit nur einem Feld | |
System.out.println(line[0]); | |
} | |
</code> | |
| |
| * {{ :faecher:informatik:oberstufe:java:aoc:aoc2022:day1:day01.png?linkonly |Aufgabe}} |
| |
==== Beispiel 2 - Zeilen mit mehreren Werten: ==== | In der ''beispiel''-Klasse ist eine mögliche Lösung für Teil 1 implementiert, dort kann man auch die Umwandlung von Strings in Zahlen nachvollziehen. Das kann man mal ausprobieren, ändern und vielleicht versuchen die Lösung für Teil 2 noch nachzutragen. In der Datei ''bsp1e'' sind die Zahlen aus dem AOC-Erklärungs-Beispiel enthalten. |
| |
<code> | Die Ergebnisse für die Eingaben, die in der Datei ''bsp1i'' in der BlueJ-Vorlage enthalten ist sind die folgenden: |
199 200 | |
200 300 | |
208 400 | |
</code> | |
| |
Man trennt die Array-Felder an Leerzeichen ''\n'': ''readInput(inputFile, ' ')'' | ++++ Ergebnis Teil 1 für die Eingabe auf dieser Wikiseite | |
| 70509 |
| ++++ |
| |
Das Ergebnis sieht dann so aus: | ++++ Ergebnis Teil 2 für die Eingabe auf dieser Wikiseite | |
| 208567 |
| ++++ |
| |
{{ :faecher:informatik:oberstufe:java:aoc:aoc2021:einfuehrung:arraylist2.png |}} | |
| |
Zugriff folgendermaßen: | ===== Mehrere Felder Trennen ===== |
| |
<code java> | Teilweise ist es nötig, die eingelesenen Zeilen an bestimmten Stellen nochmals zu trennen, wenn die Zeilen z.B so aussehen |
for (String[] line: input) { | |
// line ist ein Array der Länge 2 | |
String ersteZahl = line[0]); | |
String zweiteZahl = line[1]); | |
| |
// ... tu wat ... | |
} | |
</code> | |
| |
==== Trennzeichen ==== | 0 -> 802 |
| 2 -> 900 |
| 4 -> 1002 |
| |
Trennzeichen kann nur ein Char-Wert sein, man kann also auch an ''-'' oder ''|'' trennen, aber nicht an ''- >''((Zwei Zeichen...)) - wenn man damit die Felder nicht passend aufbereiten kann, benötigt man eine weitere Methode, um die input-ArrayList weiter für die Problemlösung vorzubereiten. Interessante Methoden der [[https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/String.html|String-Klasse]] dafür sind: | möchte man häufig die Wertepaare (0,802), (2,900), (4,1002) erhalten. |
| |
| Hier muss man die Zeilen dann für die weitere Problemlösung vorbereiten. Interessante Methoden der [[https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/String.html|String-Klasse]] dafür sind: |
| |
* ''split(zeichen)'' | * ''split(zeichen)'' |
* ''replace(needle,subst)'' | * ''replace(needle,subst)'' |
* ''trim()'' | * ''trim()'' |
===== Die Sache mit den Zahlen ===== | |
Wie in obigen Beispiel zu sehen, ist die Eingabe zunächst ein Array von Strings, was ungünstig ist, wenn man mit den Werten rechnen möchte/muss. Um aus den Strings Integer-Werte zu machen, verwendet man ''Integer.parseInt(String)'': | |
<code java> | |
for (String[] line: input) { | |
// line ist ein Array der Länge 2 | |
//String ersteZahl = line[0]); | |
int ersteZahl = Integer.parseInt(line[0]) | |
// String zweiteZahl = line[1]); | |
int zweiteZahl = Integer.parseInt(line[1]) | |
// ... rechne wat ... | |
} | |
</code> | |