Arrays - Kekziie/Informatik-II-SS-2017 GitHub Wiki

Arrays

  • Felder (arrays) sind Beispiele für Datenstrukturen
  • ein Array ist ein Container; enthält
    • festgelegte Anzahl von Werten
    • eines definierten Typs
  • Elemente sind durchnummeriert
  • Arrays dienen zur Darstellung/ Verarbeitung z.B. von Listen

Struktur

  • nummerierte Liste fester Größe bestehend aus Elementen gleichen Typs
  • Zugriff durch ganzzahligen Indizes beginnend bei 0
  • Index implizit -> braucht keinen Speicher

Deklaration, Erzeugung und Initialisierung

Deklaration

<datentyp>[] <Variable-Name>;

Erläuterung:

  • deklariert mit eckigen Klammern nach dem Datentyp
  • Array-Deklaration bestehend aus 2 Teilen:
    • Datentyp
    • Name des Arrays
  • unmittelbar nach der Deklaration kann noch nicht auf die Array-Variable zugegriffen werden -> Datenfeld mit fester Länge muss noch im Speicher erzeugt werden

Beispiel:

int[]    arrayOfInt;
String[] wordList;
float[]  prices; 

Erzeugung

Reservieren des notwendigen Speichers (Festlegen der Länge)

<Array-Variable> = new <Datentyp>[<Laenge>];

Erläuterung:

  • Erzeugung mittels Operator new
  • : Zeigervariable
  • : kann auch komplexer Ausdruck sein mit Ergebnis: ganze Zahl
    • Arrays mit Länge 0 sind möglich

Beispiel:

int laenge = 10;
int[]    a;
String[] s;

a = new int[5];
s = new String[laenge * 5 + 1];

Hinweis: Typen müssen paarweise übereinstimmen!

Zugriff auf Elemente

<Variablen-Name> [<Indes-Wert>]

Erläuterung:

  • Nummerierung der Elemente:
    • beginnt bei 0
    • endet bei Array-Länge -1
  • <Indes-Wert: kann auch komplexer Ausdruck sein (Ergebnis davon muss ganzzahliger Wert sein)

Beispiel:

float[] prices;

...
float price = prices[3]    // lesender Zugriff

int a = 2;
price = prices[4 * a +7];  // komplexer Ausdruck als Index

prices[5] = 2.3f           // Zuweisung eines Wertes

fehlerhafter Zugriff:

  • zulässiger ganzzahliger Index: 0 <= Index-Wert < Array-Länge
  • bei Zugriff auf unzulässigem Index -> Programmabbruch mit Fehlermeldung

Länge eines Arrays

gespeichert in Instanzvariable length

Beispiel:

int[] a = new int[5];    // Array mit Länge 5 angelegt
int laenge = a.length;

a[laenge - 1] = 2;      // OK
a[laenge]     = 15;     // liefert Laufzeitfehler

Varianten für Generierung/ Initialisierung

  • bei Erzeugung wird den einzelnen Elementen der Standardwert des Datentyps zugewiesen
  • verschiedene Formen der Generierung möglich

Beispiel:

String[] s = new String[5];  // Erzeugung eines Arrays bei der Deklaration der Array Variable

int[] primes = { 2, 3, 5, 7, 11};  // Erzeugung durch Angabe der Elementenmenge in geschweiften Klammern {}
                                   // Werte können beliebige Konstanten, Variablen oder beliebige Ausdrücke sein
                                   // Länge wird automatisch ermittelt
int[] prime = new int[] { 2, 3, 5, 7, 11}; 

Referenz-/ Zeigervariable

  • bei Deklaration einer Variable vom Array Typ wird nur eine Referenz auf das Datenobjekt festgelegt
  • durch Operator new wird Speicherplatz für das Feld angefordert/ reserviert
    • Element erhalten zunächst einen Initialwert (wenn keine Werte explizit durch eine Initialisierung zugewiesen wurden)
  • mit einer expliziten Initialisierung werden Werte an Feldelemente zugewiesen
  • Initialisierung müssen gleichzeitig mit Deklaration oder Generierung durch den Konstruktor erfolgen

Beispiel:

int[] binom;
binom = new int[] {1, 4, 6, 4, 1};

oder

int[] binom = {1, 4, 6, 4, 1};

Verhalten der Referenz für Array und für normale Variablen identisch:

-> Sie sind nach der ersten Zuweisung verwendbar

Beispiel:

int[] list;
int arg,
    len;

len = list.length;  // ergibt Compiler-Fehler: list existiert nicht

list = new int[3]
list[0] = arg;      // ergibt Compiler-Fehler: arg besitzt keinen Wert

Verweis auf Speicherstellen

  • eine Array-Variable enthält nicht das Array selbst, sondern nur einen Verweis auf eine Stelle im Speicher, an der sich das eigentliche Array befindet
    • Array-Variable hat immer eine feste Größe
    • Array selbst kann mit beliebiger Größe angelegt werden
    • Arrays können nicht dynamisch wachsen
  • Referenzvariablen: Variablen, die einen Zeiger auf ein Objekt enthalten

Zuweisungen

int[] list = new int[7];

list [5] = 12;

int[] list;
int[] b = new int[12];

list = b; 

Erläuterung:

  • mit Array-Variable list existiert ein Zeiger auf ein Array mit 7 Elementen
  • an das 6. Element des Arrays wird der Wert 12 zugewiesen

  • Zuweisung einer Array Variable an eine andere Array-Variable -> beide Variablen verweisen auf dasselbe Array Objekt

Default-Initialisierung von Elementen

Mit der Allokation eines Arrays mit einer definierten Anzahl von Elementen werden diese implizit mit einem Default Wert initialisiert.

  • Datentyp -> Standardwert
  • byte -> (byte) 0
  • short -> (short) 0
  • int -> 0
  • long -> 0L
  • float -> 0.0f
  • double -> 0.0d
  • char -> (char) 0
  • boolean -> false
  • Referenzdatentyp -> null

Arrays mit Schleifen

Arrays und for-Schleife

<Datentyp>[] arr = new <Datentyp>[<Integer-Ausdruck>];

...          // notwendige Initialisierung
for (int i = 0; i < arr.length; i++) { 
...         // Verarbeitung des Elements arr[i]
}

schematischer Ablauf:

  • Index-Variable wird mit 0 initialisiert
    • Arrays beginnen stets mit Index 0
    • Array-Variable wird hier mit arr bezeichnet
  • Array hat feste Länge
    • mit Instanzvariable .length abgelesen
  • letztes Element des Array steht an Position arr.length - 1
  • Elemente des Arrays werden nacheinander sequentiell durchlaufen

Standardberechnungen von Arrays

Summation von Elementen (Addition aller Werte in einem Array)

double sum = 0;
for (int i = 0; i < arr.length; i++) { 
   sum = sum + arr[i];
}

Zählen von Elementen (zählen aller Elemente mit negativen Wert -> wenn neg. Wert auf Null setzen)

int count = 0;
for (int i = 0; i < arr.length; i++) { 
   if (arr[i] < 0.0) {
      arr[i] = 0.0;
      count++;
   }
}

Zählen von Elementen (zählen aller Paare benachbarter Elemente mit gleichem Wert)

int count = 0;
for (int i = 0; i < arr.length; i++) { 
    if (arr[i] == arr[i+1]) {
       count++;
    }
}

Finden des größten Elements

double maxVal = arr[0];
for (int i = 0; i < arr.length; i++) { 
   if (arr[i] > maxVal)
      maxVal = arr[i];
}

Kopieren eines Arrays

double[] B = new double[arr.length];
for (int i = 0; i < arr.length; i++) { 
    B[i] = arr[i];
}

double[] B = new double[arr.length];
System.arraycopy(arr, 0, B, 0, arr.length);

Hinweis: Java biete eine vordefinierte Funktion, die in der Klasse System deklariert ist und für beliebigen Objekte deren Element kopiert.

public static void arraycopy (Object sourceArray, int SourceStartIndex, 
                              Object destArray, int destStartIndex, int count)

for-each Schleifen für Arrays

for (<Basis-Typ> item : anArray ) {
   ...      // Verarbeitung von item
}

Erläuterung:

  • item: Kontroll-Variable der Schleife
    • Hinweis: Kontroll-Variable muss in einer for-each Anweisung in der Schleife definiert werden!
  • : Basistyp des Arrays

Beispiel:

double[] arr = new double[512];

double sum = 0;
for ( double item : arr ) {
   if ( item > 0 )
     sum = sum + item;
 }

mehrdimensionale Arrays

Zweidimensionale Arrays

Deklaration einer Zeigervariable

<datentyp>[][] <Variablen-Name>;

Erläutertung:

  • : Vereinbarung einer Zeigervariable

Beispiel:

int[][] mat;

Generierung eines Datenobjekts

 mat = new int[3][4];

Hinweis: Deklaration und Generierung kann wieder zusammen gefasst werden

int[][] mat = new int[3][4];

Struktur

  • Anweisung mat = new int[3][4] generiert ein Datenobjekt
    • ein Array von Arrays von int Werte
  • Elemente des Datenobjekts mit Wert 0 initialisiert
  • Datenstruktur/Verweise = Matrix/Gitter

Initialisierung

Die Initialisierung muss gleichzeitig mit der Deklaration oder der Generierung durch den Konstruktor erfolgen. Dabei werden die Werte für jede weiter Dimension erneut in geschweiften Klammern geschlossen.

Beispiel:

int[][] multiDim;

// Initialisierung entspricht int[3][2]
multDim = new int[][] { {5 , 7}, {3 , 6}, {7 , 9} }; 

Zugriff auf Elemente

Beispiel:

int[][] mat = new int [] { { 1,   0, 12, -1},
                           { 7,  -3,  2,  5},
                           { -5, -2,  2, -9} };

Direktzugriff auf ein Element: mat[i][j], 0 <= i < 3 und 0 <= j < 4

mat[0][0]  mat[0][1]  mat[0][2]  mat[0][3]
mat[1][0]  mat[1][1]  mat[1][2]  mat[1][3]
mat[2][0]  mat[2][1]  mat[2][2]  mat[2][3]

Besonderheiten

  • jede Zeile als Array repräsentiert
    • Zugriff auf das Array oder seine Elemente möglich
  • 2D Arrays sind Arrays von Arrays
  • können Zeilen mit unterschiedlicher Länge besitzen
    • d.h. jede Zeile kann unterschiedlich viele Elemente enthalten

Beispiel:

int[][] multiDim = new int[][] { {5 , 7},
                                 {8 , 9, 10, 0},
                                 {1},
                                 {6 , 9} };

Drei- und höherdimensionale Arrays

Deklaration

int[][][] cube;

Folge von eckigen Klammern entsprechen der Dimension

Beispiel: Dimension 5

 int[][][][][] structure;

Generierung eines Datenobjekts

cube = new int [3][4][3];

Hinweis: Ohne explizite Zuweisung von Werten werden die Elemente mit default Werten (hier:0) initialisiert

structure = new int[3][4][3][][]

Erläuterung: Es werden Zeigervariablen generiert, die letzten Dimensionen werden hier noch nicht angelegt

Standardberechnungen

Um alle Elemente zu durchlaufen, werden häufig geschachtelte Schleifen verwendet

Beispiel:

int[][][] arr = new int [4][5][6];

double sum = 0.0d;

for (int i = 0; i < 4; i++) {
   for (int j = 0; j < 5; j++) {
      for (int k = 0; k < 6; k++) {  // Achtung: Array-Länge

          // Achtung: Index-Variablen in der richtigen Reihenfolge
          sum += arr[i][j][k];
      }
   }
}
⚠️ **GitHub.com Fallback** ⚠️