Java/Array

Aus ZUM-Unterrichten

Für größere Datenmangen reicht die bisher vorgestellte Wertzuweisung an eine Variable nicht mehr aus. Hier kommen Arrays (engl. für (Daten)-Felder) ins Spiel. Sie sind wie ein "Schubladenschrank" mit nummerierten Schubladen.


Einführung

Quipu (Khipu)
Verschiedene Massenspeichermedien (Streichholz als Maßstab)

Die Speicherung von Daten umfasst alle Speichermedien für die mechanische Bearbeitungsprozesse benötigt werden. Unterschiede bestehen hierbei in der Handhabung sowie der Lebensdauer (Haltbarkeit) des jeweiligen Speichermediums.

  • Papier, auch Papyrus, Palmblatt
  • Pergament, Tierhäute und Leder
  • Steintafel
  • Tontafel, Tonzylinder
  • Holztafel, Birkenrinde, Kerbholz
  • Wachstafel
  • Knotenschrift, Teppich von Bayeux, Webwaren und Stoffe
  • Wandzeichnung, Schiefertafel
  • Lochkarten, Lochstreifen
  • LP (Langspielplatte, Vinyl), Wachszylinder

DatenspeicherWikipedia-logo.png


Überlegung
  1. Womit würden Sie Ihre Daten speichern?
  2. Wie würden Sie Ihre Datenspeicherung organisieren / strukturieren?
  3. Nach welchen Kriterien würden Sie das Medium und die Struktur variieren?

Datenstrukturen

In der Informatik ist eine Datenstruktur eine bestimmte Art, Daten zu verwalten und miteinander zu verknüpfen, um in geeigneter Weise auf diese zugreifen und diese manipulieren zu können. Datenstrukturen sind immer mit bestimmten Operationen verknüpft, um eben diesen Zugriff und diese Manipulation zu ermöglichen.

Die Datenstruktur Array (Feld)

Das Array ist die einfachste verwendete Datenstruktur. Es werden hierbei mehrere Variablen vom selben Basisdatentyp gespeichert. Ein Zugriff auf die einzelnen Elemente wird über einen Index möglich.

Im eindimensionalen Fall wird das Array häufig als Vektor und im zweidimensionalen Fall als Tabelle oder Matrix bezeichnet. Arrays sind aber keinesfalls nur auf zwei Dimensionen beschränkt, sondern werden beliebig mehrdimensional verwendet.

Sie verwenden Arrays im Mathematikunterricht, wenn Sie Variablen mit einem Index versehen: x1, x2, x3, … xn Jedes x ist eindeutig durch seinen Index definiert. Sie kennen Arrays sogar schon in Java: Strings entsprechen Arrays aus chars (das ist der Datentyp für Zeichen).

Ein erster Beispiel-Array

Wir legen ein Feld mit Zahlen vom Typ double an (z.B. um die Raumtemperatur auf einer Zeitleiste zu erfassen).

public class ArrayTest1
{
  private double[] zahlenFeld;
 
  public ArrayTest1()
  {
    zahlenFeld = new double[10];   
  }
  
  public void setZahlInFeld(int index, double wert)
  {
    zahlenFeld[index]=wert;
  }
  
  public double getZahlInFeld(int index)
  {
    return zahlenFeld[index];
  }  
}

Die Eigenschaft zahlenfeld wird als Array mit double-Elementen deklariert:

private double[] zahlenFeld; Das Kennzeichen hierfür sind die eckigen Klammern.

Im Konstruktor wird dann ein neues Array mit 10 Elementen angelegt:

zahlenFeld = new double[10];

Auf die einzelnen Elemente kann man mit Angabe des Index zugreifen:

zahlenFeld[5]=27.3;

setzt beispielsweise zahlenFeld mit dem Index 5 auf den Wert 27.3

So erklärt sich die get- und die set-Methode im obigen Beispiel. Natürlich muss bei einem Array noch der Index genannt werden, weshalb sich der Übergabeparameter index ergibt.

Hinweis

Die Zählung eines Arrays beginnt bei 0, daher hat ein Array mit 10 Elementen den höchsten Index 9.

Greift man auf einen Index außerhalb des festgelegten Bereichs zu, so erhält man eine Fehlermeldung. Bei dem obigen Beispiel reicht es, den Index 10 zu wählen.

Vergleiche dazu die Darstellung im Object-Inspector in BlueJ.

Schritt 1: Inspect in ArrayTest1 wählen
Schritt 2: noch einmal Inspect wählen
Schritt 3: Hier sieht man das Feld mit den Elementen zahlenFeld [0] bis zahlenFeld [9]

length

Jedes Array hat die Eigenschaft length, mit der die Länge des Feldes festgestellt werden kann.

  public int getLaenge()
  {
    return zahlenFeld.length;
  }

Übung
Sprechen Sie length 10 mal nacheinander aus.


Ausgabe aller Werte

Die Ausgabe aller Werte eines Arrays lässt sich einfach mit Hilfe einer einfachen Schleife realisieren, die abbricht, wenn eine Zählvariable (in diesem Fall i) die Länge des Feldes erreicht hat.

Denken Sie daran, dass i zunächst auf 0 und nicht auf 1 gesetzt werden muss.

  public void gibAus ()
  {
      int i = 0;
      while(i < zahlenFeld.length){
         System.out.println("Index:" + i + " hat den Wert " + zahlenFeld[i]);
         i++;
      }
  }

Zufallszahlenfeld

  public void macheZufallsfeld (int maximum)
  {
      int i = 0;
      while(i < zahlenFeld.length){
         zahlenFeld[i] = (int)(maximum * (Math.random())) + 1;
         i++;
      }
  }

Die oben abgebildete Methode weist dem Feld Zufallszahlen (ohne Nachkommastellen) zu. Das ist sehr praktisch, wenn man das Feld nicht von Hand befüllen möchte. maximum gibt obere Grenze an. Die Zufallszahlen liegen also zwischen 1 und (einschließlich) maximum.

Übung
Verändern Sie die Methode: Lassen Sie Nachkommastellen in den Zufallszahlen zu.


Was ist die größte Zahl im Feld

  public double getGroessteZahl ()
  {
      double maximum=zahlenFeld[0];
      int i = 1;
      while(i < zahlenFeld.length){
         if (zahlenFeld[i] > maximum) {
            maximum = zahlenFeld[i];    
         }
         i++;
      }
      return maximum;
  }

Eine typische Aufgabe im Zusammenhang mit Arrays ist, die größte Zahl zu suchen (z.B. Maximaltemperatur bei einer Temperaturzeitreihe). Dabei geht man wie folgt vor:

  • Eine Hilfsvariable maximum bekommt den ersten Wert des Feldes zugewiesen.
  • Danach werden alle anderen Werte des Feldes durchlaufen und mit maximum verglichen.
  • Jedesmal, wenn ein größerer Wert gefunden wurde, wird maximum überschrieben.

Die folgenden Übungen sind alle ähnlich: Sie benötigen eine Schleife, Hilfsvariablen und zumindest bei 1 und 2 eine if-Abfrage.

Übung
  1. Lassen Sie in einer neuen Methode die kleinste Zahl im Feld suchen.
  2. Lassen Sie in einer neuen Methode den Index und nicht den Wert des größten Elementes zurückgeben.
  3. Lassen Sie in einer neuen Methode die Summe aller Zahlen im Feld zurückgeben.
  4. Lassen Sie in einer neuen Methode den Benutzer eine Zahl übergeben. Wenn die Zahl im Feld vorkommt, soll true zurückgegeben werden, wenn nicht false.


Textdatei als Array

Klassendiagramm

In jedem Java Buch wird erklärt, wie man mit Dateien umgeht. Hier möchte ich das nicht vertiefen, sondern setze die Klasse TxtDatei als gegeben voraus. Mit Hilfe des UML-Diagramms gelingt es, zu verstehen, wie sie angewendet werden kann.

TxtDatei hat 3 Methoden.

  • schreibe(): schreibt in eine Datei mit dem Namen„dateiname“ einen String. War es erfolgreich, gibt die Methode true zurück.
    Beispiel: t.schreibe(“testdatei“,“Hallo Welt!“);
  • liesDateiInString(): liest die gesamte Textdatei mit dem Namen „dateiname“ in einen String ein.
    Beispiel: String s = t.liesDateiInString(“testdatei“);
  • liesDateinameInArray() erfordert neben dem Dateinamen einen zweiten Parameter, nämch den maximalen Index des Arrays. Zurückgeben wird ein String-Array, bei dem jedeTextzeile ein Element des Arrays ist. Überflüssige Zeilen haben den Wert null.

Beispielprogramm Erlkönig

Das folgende Programm gibt den Erlkönig auf der Konsole aus. Die Textdatei „erlk.txt“ liegt dabei im Projektverzeichnis vor.

public class Starte {   
  public static void main( String args[] ) {
    TxtDatei datei = new TxtDatei(); 
    int max = 1000;   
    String[] zeilen = new String[max];
    zeilen = datei.liesDateiInArray("erlk", max);   
    for (int i=0; i < zeilen.length; i++) {        
      if (zeilen[i]!=null) {              
        System.out.println(zeilen[i]);  
      }   
    }
  }
} // Ende der Klasse

Übung
  1. Analysieren Sie die main Methode der Klasse Start.
  2. Lassen Sie den Erlkönig rückwärts ausgeben – die letzte Zeile zuerst. Lassen Sie nur die geraden Zeilen ausgeben. Lassen Sie nur die Zeilen, die mit einem „W“ beginnen, ausgeben. (vgl. Aufg. 4)
  3. Bei jeder neuen Strophe soll „--- Ende der Strophe ---“ ausgegeben werden.
  4. Lassen Sie bei der Ausgabe jedes „Erl“ durch „Unken“ ersetzen.
    Recherchieren Sie dazu im Internet unter Stringverarbeitung.Z.B. openbook Java Insel 9
  5. Diskutieren Sie: Welche Möglichkeiten und welche Gefahren ergeben sich durch einen Zugriff auf Dateien?


Weblinks

Siehe auch

  • Einführungsbeispiel zu ARRAYs in Java: Prüfung eines EAN-Codes:

Pdf20.gif Der EAN-Code