Grundlgen der Progrmmierung Prof. H. Mössenböck 7. Arrys
Eindimensionle Arrys Arry = Tbelle gleichrtiger Elemente [0] [1] [2] [3] Nme bezeichnet ds gesmte Arry Elemente werden über Indizes ngesprochen (z.b. [3]) Indizierung beginnt bei 0 Elemente sind "nmenlose" Vriblen Deklrtion int[] ; flot[] b; Erzeugung = new int[5]; b = new flot[10]; deklriert ein Arry nmens (bzw. b) seine Elemente sind vom Typ int (bzw. flot) seine Länge ist noch unbeknnt legt ein neues int-arry mit 5 Elementen n (us dem Hep-Speicher) weist seine Adresse zu [0] [1] [2] [3] [4] Arry-Vriblen enthlten in Jv Zeiger uf Arrys! (Zeiger = Speicherdresse) 2
Arbeiten mit Arrys Zugriff uf Arryelemente [3] = 0; [2*i+1] = [i] * 3; Arrylänge bfrgen int len =.length; Beispiele for (int i = 0; i <.length; i++) { [i] = In.redInt(); Arryelemente werden wie Vriblen benutzt Index knn ein gnzzhliger Ausdruck sein Lufzeitfehler, flls Arry noch nicht erzeugt wurde Lufzeitfehler, flls Index < 0 oder Arrylänge length ist ein Stndrdopertor, der uf lle Arrys ngewendet werden knn. Liefert Anzhl der Elemente (hier 5). // Arry einlesen int sum = 0; for (int i = 0; i <.length; i++) { sum += [i]; // Elemente ufddieren 3
Arryzuweisung [0] int[], b; = new int[3]; 0 b = ; b [0] 0 [1] [2] 0 0 [1] [2] 0 0 b[0] b[1] b[2] b Arryelemente werden in Jv stndrdmäßig mit 0 initilisiert b bekommt denselben Wert wie. Arryzuweisung ist in Jv Zeigerzuweisung! [0] = 17; b [0] [1] [2] 17 0 0 b[0] b[1] b[2] ändert in diesem Fll uch b[0] = new int[4]; 0 0 0 b 17 0 0 0 zeigt jetzt uf neues Arry. b = null; 0 0 0 b 17 0 0 0 null: Spezilwert, der uf kein Objekt zeigt; knn jeder Arryvriblen zugewiesen werden 4
Freigeben von Arryspeicher Grbge Collection (Automtische Speicherbereinigung) Objekte, uf die kein Zeiger mehr verweist, werden utomtisch eingesmmelt. Ihr Speicher steht für neue Objekte zur Verfügung sttic void P() { int[] = new int[3]; int[] b = new int[4]; int[] c = new int[2]; b = ; c = null; b c b c b c b c kein Zeiger mehr uf dieses Objekt wird eingesmmelt kein Zeiger mehr uf dieses Objekt wird eingesmmelt Am Methodenende werden lokle Vriblen freigegeben Zeiger, b, c fllen weg Objekt wird eingesmmelt 5
Initilisieren von Arrys primes int[] primes = {2, 3, 5, 7, 11; 2 3 5 7 11 identisch zu int[] primes = new int[5]; primes[0] = 2; primes[1] = 3; primes[2] = 5; primes[3] = 7; primes[4] = 11; Initilisierung knn uch bei der Erzeugung erfolgen int[] primes; primes = new int[] {2, 3, 5, 7, 11; 6
Kopieren von Arrys int[] = {1, 2, 3, 4, 5; int[] b; b 1 2 3 4 5 b = (int[]).clone(); 1 2 3 4 5 b 1 2 3 4 5 Typumwndlung nötig, d clone etws vom Typ Object[] liefert 7
Kommndozeilenprmeter Progrmmufruf mit Prmetern jv Progrmmnme pr 1 pr 2 pr n Prmeter werden ls String-Arry n min-methode übergeben clss Smple { public sttic void min (String[] rg) { for (int i = 0; i < rg.length; i++) Out.println(rg[i]); Aufruf z.b. jv Smple Anton / 10 Ausgbe: Anton / 10 rg[0] == "Anton" rg[1] == "/" rg[2] == "10" 8
Beispiel: sequentielles Suchen Suchen eines Werts x in einem Arry flls gefunden 0 17 99 x pos = 17 pos = -1 flls nicht gefunden 0 99 sttic int serch (int[], int x) { int pos =.length - 1; while ( pos >= 0 && [pos]!= x ) pos--; // pos == -1 [pos] == x return pos; gewünschtes Ergebnis Achtung: int[] wird nur ls Zeiger übergeben. Würde serch etws in ändern (z.b. [3] = 0;), würde sich diese Änderung uch uf ds Arry im Rufer uswirken. 9
Beispiel: binäres Suchen schneller ls sequentielles Suchen Arry muss llerdings sortiert sein z.b. Suche von 13 0 2 1 3 2 5 3 7 4 11 5 13 6 17 7 19 low m high Index des mittleren Element bestimmen ( m = (low + high) / 2 ) 13 > [m] zwischen [m+1] und [high] weitersuchen 0 2 1 3 2 5 3 7 4 11 5 13 6 17 7 19 low m high 10
Binäres Suchen sttic int binryserch (int[], int x) { int low = 0; int high =.length - 1; while (low <= high) { int m = (low + high) / 2; if ([m] == x) return m; else if (x > [m]) low = m + 1; else /* x < [m] */ high = m - 1; /* low > high*/ return -1; 0 1 2 3 4 5 6 7 8 9 10 11 2 3 3 5 7 7 8 10 11 15 16 17 2 3 3 5 7 7 8 10 11 15 16 17 2 3 3 5 7 7 8 10 11 15 16 17 2 3 3 5 7 7 8 10 11 15 16 17 Suchrum wird in jedem Schritt hlbiert bei n Arryelementen sind höchstens log 2 (n) Schritte nötig, um jedes Element zu finden 10 100 1000 10000 n seq.suchen bin.suchen 10 100 1000 10000 4 7 10 14 Lufzeitkomplexität = O(log2(n)) 11
Primzhlenberechnung: Sieb des Erthostenes 1. "Sieb" wird mit den ntürlichen Zhlen b 2 gefüllt 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 2. Erste Zhl im Sieb ist Primzhl. Entferne sie und lle ihre Vielfchen 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 3. Wiederhole Schritt 2 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 5, 7, 11, 13, 17, 19, 23, 25, Wiederhole Schritt 2 5, 7, 11, 13, 17, 19, 23, 25, 7, 11, 13, 17, 19, 23, 12
Implementierung Sieb = boolen-arry, Zhl i im Sieb sieve[i] == true 0 1 2 3 4 5 6 7 8 9 flse flse true true true true true true true true Zhl i entfernen: sieve[i] = flse 0 1 2 3 4 5 6 7 flse flse flse true flse true flse true 8 9 flse true sttic void printprimes (int mx) { boolen[] sieve = new boolen[mx + 1]; for (int i = 2; i <= mx; i++) sieve[i] = true; for (int i = 2; i <= mx; ) { Out.print(i + " "); // i is prime for (int j = i; j <= mx; j = j + i) sieve[j] = flse; while (i <= mx &&!sieve[i]) i++; 13
Beispiel: Montstge berechnen Bisher mit Switch-Anweisung gelöst switch (month) { cse 1: cse 3: cse 5: cse 7: cse 8: cse 10: cse 12: dys = 31; brek; cse 4: cse 6: cse 9: cse 11: dys = 30; brek; cse 2: dys = 28; Besser mit Tbelle int[] dys = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31; int d = dys[month]; 14
Mehrdimensionle Arrys Zweidimensionles Arry Mtrix 0 1 2 3 0 1 2 [0][0] [0][1] [0][2] [1][0] [1][1] [1][2] [2][0] [2][1] [2][2] [3][0] [3][1] [3][2] In Jv ls Arry von Arrys implementiert [0] [1] [0][0] [0][1] [0][2] [1][0] [1][1] [1][2] Deklrtion und Erzeugung int[][] ; = new int[4][3]; [2] [3] [2][0] [2][1] [2][2] [3][0] [3][1] [3][2] Zugriff [i][j] = [i][j+1]; 15
Mehrdimensionle Arrys Zeilen können unterschiedlich lng sein (ds ist ber selten sinnvoll) [0] [1] [2] [0][0] [0][1] [0][2] [1][0] [1][1] [2][0] [2][1] [2][2] [0][3] int[][] = new int[3][]; [0] = new int[4]; [1] = new int[2]; [2] = new int[3]; Initilisierung int[][] = {{1, 2, 3,{4, 5, 6; 1 2 3 4 5 6 16
Beispiel: Mtrixmultipliktion i b c k i = j j c 0,0 = 0,0 *b 0,0 + 0,1 *b 1,0 + 0,2 *b 2,0 sttic flot[][] mtrixmult (flot[][], flot[][] b) { flot[][] c = new flot[.length][b[0].length]; for (int i = 0; i <.length; i++) for (int j = 0; j < b[0].length; j++) { flot sum = 0; for (int k = 0; k < b.length; k++) sum += [i][k] * b[k][j]; c[i][j] = sum; return c; 17