Objekt-Arrays

Wiederholung: Arrays

In der E-Phase habt ihr Arrays kennen gelernt. Wie war das nochmal?

  • Lest euch das Fachkonzept: Array und das Fachkonzept: for-Schleife durch.
  • Beantwortet die folgenden Fragen:
    • Was ist ein Array?
    • Welche Arten von Daten können in Arrays gespeichert werden?
    • Wie werden Daten in Arrays gespeichert? Wie werden sie abgerufen?
    • Was unterscheidet die for- von der while-Schleife?
    • Warum ist es im Kontext von Arrays sinnvoller, eine for-Schleife statt einer while-Schleife zu verwenden?
Aufgabe 1 - Blubbels1), Teil $n+1$

In einer vorherigen Lektion habt ihr die Blubbels kennen gelernt.

Rechts seht ihr einen Ausschnitt aus dem Quellcode.

  • Überlegt euch, was passieren muss, wenn ihr einen neuen Blubbel (oder 2, 3, 100?!) hinzufügen wollt.

Da stellt sich doch die Frage, ob das nicht auch einfacher geht?!

Sketch

Blubbel b1 = new Blubbel(100, 10, 3);
Blubbel b2 = new Blubbel(200, 8, 2);
Blubbel b3 = new Blubbel(250, 12, 2);
Blubbel b4 = new Blubbel(350, 9, 4);
 
void setup() {
  size(400, 300);
}
 
void draw() {
  background(255);
 
  b1.display();
  b1.aufsteigen();
 
  b2.display();
  b2.aufsteigen();
 
  b3.display();
  b3.aufsteigen();
 
  b4.display();
  b4.aufsteigen();
}

Blubbel

class Blubbel {
  float x;
  float y;
  float r;
  float v;
 
  Blubbel(float x, float r, float v) {
    this.x = x;
    this.r = r;
    this.v = v;
 
    y = height - r;
  }
 
  void display() {
    fill(color(0, 0, 255));
    ellipse(x, y, r, r);
  }
 
  void aufsteigen(){
    y = y - v;
 
    if (y < 0) {
      x = random(width - r);
      y = height;
      v = random(5);
    }
  }
}
Beispiel - Blubbel-Array

Den Blubbel-Sketch-Code von oben könntet ihr auch durch den Code rechts ersetzen. Hier wurden die einzelnen Blubbel-Variablen b1, b2, b3 und b4 durch den Blubbel-Array blubbels ersetzt. Dieser wird in der setup()-Methode mit Blubbel-Blasen gefüllt. Außerdem wurden die einzelnen Aufrufe für die display()- und aufsteigen()-Methoden durch eine for-Schleife ersetzt.

Wenn wir nun einen neuen Blubbel hinzufügen wollen, müssen wir allerdings immer noch mehrere Stellen im Code anpassen. Das ist umständliche Schreibarbeit (man muss immer blubbels[i] = new Blubbel(…) schreiben und die Array-Größe anpassen). Es geht aber auch einfacher:

Blubbel[] blubbels = new Blubbel[] {
  new Blubbel(100, 10, 3),
  new Blubbel(200, 8, 2),
  new Blubbel(250, 12, 2),
  new Blubbel(350, 9, 4)
};
 
void setup() {
  size(400, 300);
}

Mit dieser Kurzform wird der Array blubbels automatisch mit passender Größe deklariert und die einzelnen Felder mit Blubbel-Blasen gefüllt. Möchte man nun einen neuen Blubbel hinzufügen, muss man ihn nur noch im Array anlegen (siehe rechts), den Rest übernimmt Java automatisch.

Blubbel[] blubbels = new Blubbel[4];
 
void setup() {
  size(400, 300);
 
  blubbels[0] = new Blubbel(100, 10, 3);
  blubbels[1] = new Blubbel(200, 8, 2);
  blubbels[2] = new Blubbel(250, 12, 2);
  blubbels[3] = new Blubbel(350, 9, 4);
}
 
void draw() {
  background(255);
 
  for (int i = 0; i < blubbels.length; i++) {
    blubbels[i].display();
    blubbels[i].aufsteigen();
  }
}
Blubbel[] blubbels = new Blubbel[] {
  new Blubbel(100, 10, 3),
  new Blubbel(200, 8, 2),
  new Blubbel(250, 12, 2),
  new Blubbel(350, 9, 4),
  new Blubbel(50, 7, 6), // Erster neuer Blubbel
  new Blubbel(150, 12, 1) // Zweiter neuer Blubbel
};
Die for-each-Schleife

Das obige Beispiel zeigt, wie man Daten aus einem Array mit Hilfe einer for-Schleife auslesen kann. Hierzu ist einiges an Syntax notwendig. Man muss eine Hilfsvariable i deklarieren, die von 0 bis zur Arraygröße hochgezählt wird. Danach muss man mit blubbels[i] auf das i-te Array-Element zugreifen. Ganz schön umständlich!

for (int i = 0; i < blubbels.length; i++) {
  blubbels[i].display();
  blubbels[i].aufsteigen();
}

Um den Code etwas besser verständlich zu machen, lohnt es sich oft, eine weitere Variable blubb einzuführen, damit man den Index blubbels[i] nicht immer schreiben muss:

for (int i = 0; i < blubbels.length; i++) {
  Blubbel blubb = blubbels[i];
 
  blubb.display();
  blubb.aufsteigen();
}

Für dieses Konstrukt bietet Java eine einfachere Schreibweise, die for-each-Schleife. Hier wird für jede einzelne Blubbel-Blase die Schleife durchlaufen, und das aktuelle Arrayelement in der Variable blubb gespeichert.

for (Blubbel blubb : blubbels) {
  blubb.display();
  blubb.aufsteigen();
}

Beide Konstrukte sind äquivalent. Eines davon (Tipp: die for-each-Schleife!) ist allerdings syntaktisch deutlich einfacher! Einziger Nachteil: man hat keinen direkten Zugriff mehr auf den Index des Elements. Dies kann (z.B. insbesondere bei Such- oder Sortierverfahren) nachteilig sein.

Aufgabe 2 - Ufo-Arrays

Passt die Ufo-Aufgabe (Aufgabe 3 aus Klassen und Objekte) so an, dass ein Array und eine for- oder eine for-each-Schleife verwendet wird.

Aufgabe 3 - Autobahn
  1. Passt die Auto-Aufgabe (Aufgabe 4 aus Klassen und Objekte) so an, dass sie mehrere Arrays (je ein Array für Bäume, Häuser und Autos) und for(-each)-Schleifen verwendet.
  2. Fügt mehrere Autos hinzu.