Folien



(letzte Synchronisation der PDF-Präsentation: 02.08.2017)

Falls keine PDF-Präsentation zu sehen ist, klicken Sie zum Download hier: Direktdownload PDF-Präsentation

Beispiel: Verzinstes Guthaben --> Sparplan

Wir haben ein Guthaben von 100 Euro, das wir mit einem Zinssatz von 10% pro Jahr verzinsen. Jedes Jahr verändert sich das Guthaben also so:

Wir könnten hier auch eine Index-Schreibweise wie in der Mathematik verwenden (z.B. jahr1 ...) oder mit Indizes in eckigen Klammern arbeiten:

Zum Speichern in Variablen hätten wir die Möglichkeit, für jedes Jahr eine Variable anzulegen, z.B. jahr0 = 100.00, jahr1 = 110.00 ...

Das hat signifikante Nachteile - so ist es schwer herauszubekommen, welche Variablen alle zum Sparplan gehören. Sortieren oder die Anzahl Bestimmen ist ebenfalls nicht einfach.

Deshalb benutzt man Feldvariablen (oder auch: Arrays). Die Variable nimmt verschiedene Werte des gleichen Datentyps auf, über den Index kann man auf die einzelnen Werte zugreifen. Im folgenden Beispiel drei Elemente vom Typ double:

Arrays: Eigenschaften

Das erste Element besitzt immer den Index 0. Bei einem Array, das die Monate enthält, wird der Dezember also durch den Index 11 angezeigt (monate[11]).

Die Größe wird bei der Erzeugung angegeben und ist nachträglich nicht mehr veränderbar!

Außerdem handelt es sich um Referenztypen, s.u.

Arrays in Java: Syntax

Arrays können durch new erzeugt werden; möglich ist auch die sofortige Initialisierung mit Werten.

Mit new:

Java-Code
  double[] guthaben = new double[3]; // Definition + Erzeugung Array // Größe des Arrays wird in der Klammer angegeben!   guthaben[0] = 100.00; guthaben[1] = 110.00; guthaben[2] = 121.00; // Initialisierung des Arrays mit Werten    

Achtung: Im obigen Beispiel hat das dritte Element den Index 2 (da das erste Element den Index 0 hat!).

Definition, Erzeugung und Initialisierung in einem Schritt:

Java-Code
  double[] guthaben = {100.00, 110.00, 121.00};  

Hier wird die Größe durch die Anzahl der Werte festgelegt. Bei String-Arrays kommen die Werte natürlich in Anführungszeichen:

Java-Code
  String[] namen = {"John", "Heinrich", "Mary"};  

Wer bis hier mitgekommen ist, kann unten Aufgabe 1 bearbeiten ("Java_30-Arrays-1: Array definieren, einfach").

Arrays als Referenztypen / Arrays kopieren

Arrays sind Referenztypen, d.h. sie verweisen lediglich auf die enthaltenen Werte.

Wir nehmen folgende zwei Definitionen:

Java-Code
  int[] guthaben = {20, 40}; int[] geld = {100, 139};  

Damit haben wir zwei Arrays, die wir uns so vorstellen können:

Wenn wir nun das eine Array in das andere kopieren, z.B. durch

Java-Code
  geld = guthaben;  

dann erhalten wir zwei verschiedene VERWEISE (Referenzen) auf ein und dasselbe Array - beide Arrayvariablen (geld und guthaben) verweisen darauf.

Änderung in der einen Variablen betreffen auch die andere! geld[1] = 100 führt dazu, dass auch guthaben[1] == 100 ist!

Wenn Sie bis hierhin mitgekommen sind, können Sie unten Aufgabe 2 ("Java_30-Arrays-2: Array duplizieren") bearbeiten.

Arrays mit Schleifen durchlaufen

Um Inhalte von Arrays auszugeben oder zu manipulieren, benutzt man Schleifen. Dazu muss man die Länge des Arrays kennen, diese kann man mit .length eruieren:

Java-Code
  int[] wetterdaten = {1,4,2,6} int anz = wetterdaten.length; System.out.println("Anzahl der Elemente: " + anz);  

1) For-Schleife

Für Ausgabe und Verändung von Arraywerten kann man die klassische for-Schleife benutzen:

Java-Code
  // Beispiel 1   String[] name = {"Heinrich","Margarete","Joe"};   for(int i = 0;i < name.length; i++) { System.out.println("Name " + i + ": " + name[i]); }  

Hier werden alle Elemente des Arrays durchlaufen und die Werte ausgegeben. Beachten Sie, dass die Schleife bei 0 startet, dafür aber nur bis < length läuft (und nicht bis <= length).

Mit for-Schleifen können auch Werte verändert werden:

Java-Code
  // Beispiel 2   int[] quadrat = new int[20];   for(int i = 0;i < quadrat.length; i++) { quadrat[i] = i * i; System.out.println(i+" zum Quadrat=" + quadrat[i]); }    

Hier wird jeder Index ins Quadrat gesetzt, die Ausgabe ist entsprechend:
...
6 zum Quadrat = 36
7 zum Quadrat = 64
...

2. foreach-Schleife

Die foreach-Schleife ist eine verkürzte Form der for-Schleife. Es können Werte nur AUSGEGEBEN werden, es kann NUR EIN Array durchlaufen werden:

Java-Code
  String[] name = {"Heinrich","Margarete","Joe"};   for(String n : name) { System.out.println(n); }  

Alle Elemente des Arrays werden eines nach dem anderen durchlaufen. Einer neuen Variablen wird der Wert des aktuellen Elements zugewiesen.

Sie sind jetzt bereit für Aufgabe 3 unten ("Java_30-Arrays-3: Array mit Schleifen durchlaufen")

Mehrdimensionale Arrays

Bei mehrdimensionalen Arrays enthält jedes Array-Element ein Array. Wichtig:

  • Alle Arrays müssen vom gleichen Datentyp sein.
  • Alle verschachtelten Arrays können von unterschiedlicher Größe sein.

Beispiel: Ein einfaches Array String[] einfach = new String[2]:

Hier hat einfach[0] den Wert "wert 1", einfach[1] den Wert "wert 2".

Nun erzeugen wir ein zweidimensionales Array, wo die einzelnen Arrayelemente (z.B. einfach[0]) nicht mehr einfach nur einen Wert beinhalten, sondern ein neues Array. Dazu verwenden wir String[][] mehrfach = new String[2][3]:

Hier enthält mehrfach[0][] ein eigenes Array, so dass mehrfach[0][0] = "wert a", mehrfach[0][1] = "wert b" usw. Entsprechend hat natürlich mehrfach[1][0] den Wert "wert d".

Zweidimensionale Arrays, die Tabellen abbilden

Oft verwendet man zweidimensionale Arrays, um Tabellen abzubilden (es kommen natürlich auch mehrdimensionale Strukturen vor, der Einfachheit halber beschränken wir uns auf zwei). Die erste Dimension kann dann für die Zeilen stehen, die zweite Dimension für die Spalten:

Zuerst definieren wir die Dimensionen:

Java-Code
  // Dimensionen definieren   int anzahlZeilen = 2; int anzahlSpalten = 3;   String[][] tabelle = new String[anzahlZeilen][anzahlSpalten];  

Wir haben so eine Tabelle mit 2 Zeilen und 3 Spalten erzeugt. tabelle[0][2] steht also für die erste Zeile, dritte Spalte.

Nun können wir die Anzahl der Elemente in den einzelnen Dimensionen ausgeben lassen:

Java-Code
  System.out.println("Array-Länge: " + tabelle.length); // Ausgabe: 2 (denn in der ersten Dimension 2 Elemente)   System.out.println("Länge der Dimension 0: "+tabelle[0].length); // Ausgabe: 3 (denn erstes Element enthält 3 Elemente)    

Um die Tabelle zu füllen, müssen in einer verschachtelten Schleife die Zeilen und die Spalten durchlaufen werden:

Java-Code
  // Zeilen durchlaufen (= 1. Dimension) for(int zeile = 0;zeile < anzahlZeilen;zeile++) { // Spalten durchlaufen (= 2. Dimension) for(int spalte = 0;spalte < anzahlSpalten;spalte++) { tabelle[zeile][spalte] = "zeile " + zeile + ", spalte " + spalte"; } }

Für die Zeile 0 werden die einzelnen Spalten durchlaufen und gefüllt, anschließend für Zeile 1 usw.

Auf die gleiche Art und Weise können die Werte ausgegeben werden:

Java-Code
  // Zeilen durchlaufen (= 1. Dimension) for(int zeile = 0;zeile < anzahlZeilen;zeile++) { // Spalten durchlaufen (= 2. Dimension) for(int spalte = 0;spalte < anzahlSpalten;spalte++) { System.out.printf("Wert für Zeile %d, Spalte %d: %s%n", zeile, spalte, tabelle[zeile][spalte]); } }  

Sie sind jetzt bereit für Aufgabe 4 ("Java_30-Arrays-4: Mehrdimensionales Array - Kalender")

Arrays mit Objekten

Arrays können als Werte natürlich auch Objekte beherbergen (wie z.B. bei String-Array der Fall).

Wir nehmen eine Klasse Hund, die die Methode huepf() hat. Wenn der Hund jünger als 20 Jahre ist, hüpft er gern und hoch, wenn er älter ist, ächzt er nurmehr.

Java-Code
  public class Hund { public String name; public int alter; public Hund(String name, int alter){ this.name = name; this.alter = alter; } public void huepf(){ if(this.alter < 20){ System.out.println(this.name + " - HÜPF! bin erst " + this.alter); } else{ System.out.println(this.name + " - ächz! bin schon " + this.alter); } } }  

Nun können wir einige Objekte der Klasse Hund erzeugen und sie in einem Array speichern. In den Arrayelementen sind diese Objekte nun gespeichert und wir können z.B. auf ihre Methoden zugreifen:

Java-Code
  Hund a = new Hund("Fifi", 10); Hund b = new Hund("Rex", 3); Hund c = new Hund("Hasso", 27);   Hund[] hundeArray = {a,b,c};   hundeArray[0].huepf(); hundeArray[1].huepf(); hundeArray[2].huepf();  

Das führt zur Ausgabe:
Fifi - HÜPF! bin erst 10
Rex - HÜPF! bin erst 3
Hasso - ächz! bin schon 27

Jetzt können Sie unten Aufgabe 5 lösen ("Java_30-Arrays-5: Array mit Objekten") und sich anschließend an Aufgabe 6 versuchen.

Übungen

Alle Übungen finden Sie in der Materialsammlung (dort auch alle zusätzlichen Dateien wie Bilder, Klassendiagramme oder HTML-Vorlagen!).

Die aktuelle Übung können Sie hier als txt-File herunterladen.


***** Übungen: Java - Arrays *****

Java_30-Arrays-1: Array definieren, einfach

Sie kennen einen Börsentrick, mit dem Sie den Wert Ihres Aktiendepots
jeden Monat verdoppeln. Uns interessiert immer nur der Erste des Monats.

Sie starten am 01.01.2014 mit 20 Euro. Am 01.04. zählen Sie Ihr Geld.

1) Wie viele Elemente enthält das Array?
2) Welchen Index hat das Element, das den 01.01.2014 repräsentiert?
3) Welchen Index hat das Element, das den 01.04.2014 repräsentiert?

4) Programmieren Sie ein int-Array mit den Werten zum jeweiligen Monatsanfang. (Die Werte werden nicht errechnet, sondern manuell angegeben.)
5) Geben Sie unter Verwendung der Arrayvariablen den Satz aus: "Zu Beginn hatte ich 20 Euro, am 01.04. habe ich 160 Euro."
6) (Fortgeschrittene) Sie möchten alle Werte in der Konsole untereinander ausgeben. Verwenden Sie eine for-Schleife.





Java_30-Arrays-2: Array duplizieren

1. Erstellen Sie ein int-Array primzahlen[], das die ersten 5 Primzahlen enthält.
2. Definieren Sie ein neues Array primzahlenDuplikat[] und erstellen Sie dort eine "Kopie" des Arrays primzahlen[] (int[] primzahlenDuplikat = primzahlen).
3. Verändern Sie in primzahlen[] Werte und überprüfen Sie, ob diese sich in primzahlenDuplikat[] ebenfalls geändert haben.

4. Sie können ein Array bspw. "richtig" kopieren, indem Sie auf das Array die Methode clone() anwenden. Probieren Sie das aus und überprüfen Sie, ob nun tatsächlich zwei verschiedene Arrays existieren.




Java_30-Arrays-3: Array mit Schleifen durchlaufen

1) Definieren Sie ein int-Array namens "tage" mit 365 Elementen.
2) Sorgen Sie mittels einer Schleife dafür, dass der Wert der Array-Elemente jeweils dem Index + 1 entspricht, also
tage[0] = 1
tage[1] = 2
...
tage[364] = 365
3) Lassen Sie den Inhalt des Arrays mittels einer foreach-Schleife ausgeben. Sie müssten die Werte 1 bis 365 erhalten.
4) Lassen Sie sich eine Liste in folgendem Format ausgeben:
1 Tage haben 24 Stunden
2 Tage haben 48 Stunden
3 Tage haben 72 Stunden
...




Java_30-Arrays-4: Mehrdimensionales Array - Kalender

1) Erstellen Sie ein zweidimensionales String-Array "januarKalender". Die erste Dimension enthält die 31 Tage, die zweite Dimension die Stunden jeden Tages (nämlich 24 pro Tag). Der Wert für alle Stunden gleich, nämlich "nichts"
2) Tragen Sie Ihre Termine ein:
1. Januar, 5. Stunde: "Aufstehen!!!"
januarKalender[0][4] = "Aufstehen!!!!";
1. Januar, 10. Stunde: "Mittagessen"
31. Januar, 23. Stunde: "Gute Nacht!"
3) Lassen Sie sich mithilfe einer Schleife die 24 Stunden des 1. Januar komplett ausgeben.
1. Januar, 0 Uhr: nichts
1. Januar, 1 Uhr: nichts
...
4) Lassen Sie sich mithilfe einer Schleife alle Tage des Januars wie in der vorigen Aufgabe ausgeben.
5) Das FBI will Ihren Kalender durchforsten! Löschen Sie alle Termine.




Java_30-Arrays-5a: Array mit Objekten

1) Programmieren Sie die Klasse Rechnung:
16java/java30_arrays_bild_Rechnung.png

2) Erzeugen Sie 4 Objekte dieser Klasse (jeweils mit eigener Rechnungsnummer und eigenem Rechnungsbetrag).

3) Erstellen Sie ein Array "rechnungen", das diese 4 Objekte abspeichert.

4) Wenden Sie die Settermethoden auf ein Element an und verändern Sie die Rechnungsnummer und den Rechnungsbetrag. Lassen Sie sich beides über Gettermethoden ausgeben.




Java_30-Arrays-5b: Array mit Objekten - Durchlaufen mit Schleife

Durchlaufen Sie das Array rechnungen (letzte Aufgabe) mit einer Schleife.

Geben Sie in einer Liste alle Rechnungsbeträge aus.
Geben Sie in einer Liste alle Rechnungsnummern aus.

Fortgeschrittene:
Geben Sie den Durchschnitt aller Rechnungsbeträge aus.





Java_30-Arrays-5c: Array mit Objekten - Abschlussübung

Ihnen liegen die Bilder einiger Sammelkarten mit Fußballspielern vor. Wir wollen die Fußballspieler in Objekten abspeichern und diese Objekte in einem Array verwalten.

1) Erzeugen Sie eine Klasse "Fussballspieler" mit mindestens vier Attributen. Dabei sein muss der (Nach-)Name, ansonsten sind Sie frei (Tore, Pässe, Verein ...).
2) Erzeugen Sie ein Array, das diese Objekte verwaltet.
3) Lassen Sie eine Liste der Fußballspieler ausgeben, etwa in folgendem Format:
Reus spielt bei Dortmund, kostet 12.5 Mio und hat 16 Tore geschossen.
Goetze spielt bei Bayern, kostet 11.0 Mio und hat 10 Tore geschossen.


Zusatzaufgabe (schwierig!):
4) Lassen Sie die Durchschnittswerte berechnen (am besten in einer eigenen Methode; dies geht natürlich nicht in der Startklasse) und ergänzen Sie die Ausgabe von Aufgabe 3 um eine entsprechende Anmerkung für alle überdurchschnittlichen Eigenschaftswerte. Wenn ein Eigenschaftswert nicht über dem Durchschnitt liegt, wird keine Meldung ausgegeben.
"Reus: Dortmund, Wert 12.5 Mio, 16 Tore. Liegt 3.5 Tore über dem Durchschnitt. Liegt 1.4 Mio Euro über dem Durchschnitt.
Goetze: Dortmund, Wert 11.0 Mio, 10 Tore.

5) Mögliche weitere Aktivitäten:
- Lassen Sie alle Spieler des SC Freiburg ausgeben (oder: alle Spieler, deren Wert über 10 Mio liegt o.ä.)
- Ändern Sie den Transferwert eines Spielers auf 100 Mio.
- Bauen Sie das gleiche System (Aufgaben 2-4) als ArrayList. Für den Schleifendurchlauf verwenden Sie eine foreach-Schleife.
- Verwenden Sie die bekannten Methoden der ArrayList:
--- Löschen Sie die ganze Liste.
--- Löschen Sie den Fußballer mit dem Indexwert 1.
--- Fügen Sie nachträglich einen neuen Fußballer hinzu.
--- Fügen Sie nachträglich einen neuen Fußballer an der Indexposition 0 hinzu.
---






Java_30-Arrays-6: Mehrdimensionales Array - Quader

Sie möchten den Rauminhalt von Quadern vergleichen. Quader sind definiert durch Breite, Länge und Höhe. Wir denken in ganzen Zentimetern, d.h. wir haben ganzzahlige Maße.

1) Wir wollen alle möglichen Quader betrachten, deren Maße mindestens 1, maximal aber 5 entsprechen. Wie viele sind das?
2) Erstellen Sie ein dreidimensionales Array quader[][][], das den Rauminhalt aller möglichen Quader mit den in 1) angegebenen Einschränkungen enthält.
3) Über die Konsole kann der Benutzer Höhe, Breite und Tiefe eingeben. Als Ergebnis wird ihm unter Verwendung des Arrays(!) der korrekte Rauminhalt ausgegeben.
4) Sorgen Sie dafür, dass bei allen Quadern, die eine Tiefe von 1 haben, möglichst unauffällig ein falsches Ergebnis ausgegeben wird.