Eindimensionale Arrays
Eindimensionale Arrays
Eindimensionale Arrays
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
Problemorientierte Programmiersprachen - Java I SS 2000<br />
<strong>Eindimensionale</strong> <strong>Arrays</strong><br />
Erzeugen (2 Möglichkeiten):<br />
• Erzeugung durch new-Operator:<br />
float v[] = new float[4];<br />
v:<br />
0.0f 0.0f 0.0f 0.0f<br />
v[0]<br />
v[3]<br />
• <strong>Arrays</strong> sind Objekte.<br />
• Sie werden dynamisch erzeugt<br />
• Sie werden automatisch vom Garbage Collector entfernt .<br />
• Aber kein Konstruktor, sondern new-Operator.<br />
• Anzahl der Komponenten des <strong>Arrays</strong> muß bei der Definition<br />
angegeben werden.<br />
• Die Länge des <strong>Arrays</strong> erhält man durch das length-Attribut des<br />
<strong>Arrays</strong> (v.length ist in unserem Beispiel gleich 4).<br />
• Die Indizes der Komponenten müssen ganzzahlig sein.<br />
• Die Komponenten selbst werden mit 0 beginnend numeriert.<br />
• Der größte zulässige Index ist immer um 1 kleiner ist als die<br />
Anzahl der Komponenten (length-1).<br />
• Negative Indizes und Indizes größer oder gleich der Länge length<br />
sind nicht zugelassen (z.B. [v.length] führt zum Fehler).<br />
• Die Elemente eines auf diese Weise erzeugten <strong>Arrays</strong> werden mit<br />
dem für diesen Typ üblichen Standardwert initialisiert. (Bei unserem<br />
Array v beispielweise mit 0.0f.)<br />
• Direkter Zugriff auf jede Komponente (z.B. v[1] = 1.2).<br />
A. Schmidt, W. Süß 1 19.10.2000
Problemorientierte Programmiersprachen - Java I SS 2000<br />
• Erzeugung durch einen Initialisierer:<br />
int lt[] = {1,2,4,8,16,32,64,128};<br />
Diese Syntax erzeugt auf dynamische Weise einen Array und initialisiert seine<br />
Elemente mit den angebenen Werten.<br />
lt:<br />
1 2 4 8 16 32 64 128<br />
lt[0] lt[3] lt[7]<br />
Beispiel: (Ausgabe des <strong>Arrays</strong> lt)<br />
public class lt {<br />
public static void main(String[] args) {<br />
int lt[] = {1,2,4,8,16,32,64,128};<br />
for(int i = 0; i < lt.length; i++)<br />
System.out.println(lt[i]);<br />
}<br />
}<br />
Beispiel: (Summe des <strong>Arrays</strong> lt)<br />
public class lt {<br />
public static void main(String[] args) {<br />
int lt[] = {1,2,4,8,16,32,64,128};<br />
int summe =0;<br />
for(int i = 0; i < lt.length; i++)<br />
summe = summe + lt[i];<br />
System.out.println("Summe: " +summe);<br />
}<br />
}<br />
A. Schmidt, W. Süß 2 19.10.2000
Problemorientierte Programmiersprachen - Java I SS 2000<br />
Beispiel: (Erzeugen eines Feldes mit Zufallszahlen als Inhalt)<br />
public class MyArray {<br />
public static void main(String[] args) {<br />
double nums[] = new double[10];<br />
for(int i = 0; i < nums.length; i++)<br />
nums[i] = Math.random() * 100;<br />
}<br />
}<br />
for(int i = 0; i < nums.length; i++)<br />
System.out.println(nums[i]);<br />
Beispiel: (Suchen des größten Wertes im Array)<br />
public class ArrayGreat {<br />
public static void main(String[] args) {<br />
double[] nums = new double[10]; //Klammern<br />
//koennen auch hier stehen<br />
for(int i = 0; i < nums.length; i++)<br />
nums[i] = Math.random() * 100;<br />
}<br />
}<br />
int max=0;<br />
//Index des groessten Elementes<br />
for(int i = 1; i < nums.length; i++)<br />
if (nums[max]
Problemorientierte Programmiersprachen - Java I SS 2000<br />
Deklaration eines <strong>Arrays</strong>:<br />
public class MyArray1 {<br />
public static void main(String[] args) {<br />
int a1[]= {1,2,3,4,5}; // Definition von a1<br />
int a2[]; // Deklaration von a2;<br />
for(int i = 0; i < a1.length; i++)<br />
System.out.println(a1[i]);<br />
for(int i = 0; i < a2.length; i++)<br />
System.out.println(a2[i]); }<br />
}<br />
Ergibt einen Fehler, da a2 nicht initialisiert wurde.<br />
Zuweisung von <strong>Arrays</strong>:<br />
public class MyArray1 {<br />
public static void main(String[] args) {<br />
int a1[]= {1,2,3,4,5}; // Definition von a1<br />
int a2[]; // Deklaration von a2;<br />
}<br />
a2 = a1;<br />
// Zuweisung von a1 an a2<br />
for(int i = 0; i < a1.length; i++)<br />
System.out.println(a1[i]);<br />
for(int i = 0; i < a2.length; i++)<br />
System.out.println(a2[i]); }<br />
A. Schmidt, W. Süß 4 19.10.2000
Problemorientierte Programmiersprachen - Java I SS 2000<br />
Kopieren von <strong>Arrays</strong> (by reference):<br />
public class ArrayCopy {<br />
public static void main(String[] args) {<br />
int[] a = {1,2,4,8,16};<br />
System.out.print("a: ");<br />
for(int i = 0; i < a.length; i++)<br />
System.out.print (a[i]+" ");<br />
System.out.println();<br />
int[] b = {32,64,128,256,512,1024};<br />
System.out.print("b: ");<br />
for(int i = 0; i < b.length; i++)<br />
System.out.print(b[i]+" ");<br />
System.out.println();<br />
a=b;<br />
System.out.print("a: ");<br />
for(int i = 0; i < a.length; i++)<br />
System.out.print(a[i]+" ");<br />
System.out.println();<br />
a[0]=33;<br />
System.out.print("a: ");<br />
for(int i = 0; i < a.length; i++)<br />
System.out.print (a[i]+" ");<br />
System.out.println();<br />
System.out.print("b: ");<br />
for(int i = 0; i < b.length; i++)<br />
System.out.print(b[i]+" ");<br />
System.out.println();<br />
}<br />
}<br />
Ausgabe:<br />
a: 1 2 4 8 16<br />
b: 32 64 128 256 512 1024<br />
a: 32 64 128 256 512 1024<br />
a: 33 64 128 256 512 1024<br />
b: 33 64 128 256 512 1024<br />
A. Schmidt, W. Süß 5 19.10.2000
Problemorientierte Programmiersprachen - Java I SS 2000<br />
Referenzdatentypen<br />
• Die komplexeren Datentypen von Java sind Objekte und <strong>Arrays</strong>. Sie<br />
werden als „Referenztypen“ bezeichnet, weil sie „per Referenz“ (by<br />
reference) verarbeitet werden.<br />
• Im Gegensatz dazu werden die einfachen Datentypen by value, also<br />
„per Wert“ verarbeitet.<br />
Kopieren von Variablen (by value):<br />
public class VarCopy {<br />
public static void main(String[] args) {<br />
int a = 1;<br />
System.out.println("a: "+a);<br />
int b = 2;<br />
System.out.println("b: "+b);<br />
a=b;<br />
System.out.println("a: "+a);<br />
System.out.println("b: "+b);<br />
a=3;<br />
System.out.println("a: "+a);<br />
System.out.println("b: "+b);<br />
}<br />
}<br />
Ausgabe: a: 1<br />
b: 2<br />
a: 2<br />
b: 2<br />
a: 3<br />
b: 2<br />
A. Schmidt, W. Süß 6 19.10.2000
Problemorientierte Programmiersprachen - Java I SS 2000<br />
Kopieren von Objekten (by reference):<br />
public class Circle {<br />
public double x,y,r; // Instanzvariablen<br />
// Die Konstruktormethoden<br />
public Circle(double x, double y, double r)<br />
{ this.x = x; this.y = y; this.r = r;<br />
}<br />
public Circle(double r) {this(0.0,0.0,r);}<br />
public Circle(Circle c) {this (c.x,c.y,c.r);}<br />
public Circle(){this(0.0,0.0,1.0);}<br />
public double circumference()<br />
{ return 2 * 3.14159 * r; }<br />
public double area() {return 3.14159 * r*r; }<br />
public static void main(String[] args) {<br />
Circle c1 = new Circle();<br />
Circle c2 = new Circle(2,2,4);<br />
System.out.println("Area c1: " + c1.area());<br />
System.out.println("Area c2: " + c2.area());<br />
c2=c1;<br />
System.out.println("Area c1: " + c1.area());<br />
System.out.println("Area c2: " + c2.area());<br />
c1.r=2;<br />
System.out.println("Area c1: " + c1.area());<br />
System.out.println("Area c2: " + c2.area());<br />
}<br />
}<br />
Ausgabe: Area c1: 3.14159<br />
Area c2: 50.26544<br />
Area c1: 3.14159<br />
Area c2: 3.14159<br />
Area c1: 12.56636<br />
Area c2: 12.56636<br />
A. Schmidt, W. Süß 7 19.10.2000
Problemorientierte Programmiersprachen - Java I SS 2000<br />
Kopieren von <strong>Arrays</strong> (by value):<br />
public class ArrayCopy {<br />
public static void main(String[] args) {<br />
int[] a = {1,2,4,8,16};<br />
System.out.print("a: ");<br />
for(int i = 0; i < a.length; i++)<br />
System.out.print (a[i]+" ");<br />
System.out.println();<br />
int[] b = {32,64,128,256,512,1024};<br />
System.out.print("b: ");<br />
for(int i = 0; i < b.length; i++)<br />
System.out.print(b[i]+" ");<br />
System.out.println();<br />
System.arraycopy(a,0,b,0,a.length);<br />
System.out.print("a: ");<br />
for(int i = 0; i < a.length; i++)<br />
System.out.print(a[i]+" ");<br />
System.out.println();<br />
System.out.print("b: ");<br />
for(int i = 0; i < b.length; i++)<br />
System.out.print(b[i]+" ");<br />
System.out.println();<br />
a[0]=33;<br />
System.out.print("a: ");<br />
for(int i = 0; i < a.length; i++)<br />
System.out.print (a[i]+" ");<br />
System.out.println();<br />
System.out.print("b: ");<br />
for(int i = 0; i < b.length; i++)<br />
System.out.print(b[i]+" ");<br />
System.out.println();<br />
Ausgabe:<br />
}<br />
}<br />
a: 1 2 4 8 16<br />
b: 32 64 128 256 512 1024<br />
a: 1 2 4 8 16<br />
b: 1 2 4 8 16 1024<br />
a: 33 2 4 8 16<br />
b: 1 2 4 8 16 1024<br />
A. Schmidt, W. Süß 8 19.10.2000
Problemorientierte Programmiersprachen - Java I SS 2000<br />
Vorsicht vor Überschreitung der Arraygrenzen:<br />
public class ArrayCopy {<br />
public static void main(String[] args) {<br />
int[] a = {1,2,4,8,16};<br />
System.out.print("a: ");<br />
for(int i = 0; i < a.length; i++)<br />
System.out.print (a[i]+" ");<br />
System.out.println();<br />
int[] b = {32,64,128,256,512,1024};<br />
System.out.print("b: ");<br />
for(int i = 0; i < b.length; i++)<br />
System.out.print(b[i]+" ");<br />
System.out.println();<br />
System.arraycopy(a,0,b,b.length,a.length);<br />
System.out.print("a: ");<br />
for(int i = 0; i < a.length; i++)<br />
System.out.print(a[i]+" ");<br />
System.out.println();<br />
System.out.print("b: ");<br />
for(int i = 0; i < b.length; i++)<br />
System.out.print(b[i]+" ");<br />
System.out.println();<br />
a[0]=33;<br />
System.out.print("a: ");<br />
for(int i = 0; i < a.length; i++)<br />
System.out.print (a[i]+" ");<br />
System.out.println();<br />
}<br />
}<br />
System.out.print("b: ");<br />
for(int i = 0; i < b.length; i++)<br />
System.out.print(b[i]+" ");<br />
System.out.println();<br />
Keine Erweiterung eines bestehenden <strong>Arrays</strong> möglich! Lösung:<br />
int c[] = new int [a.length + b.length]<br />
System.arraycopy(a,0,c,0,a.length);<br />
System.arraycopy(b,0,c,a.length,b.length);<br />
A. Schmidt, W. Süß 9 19.10.2000
Problemorientierte Programmiersprachen - Java I SS 2000<br />
Beispiel: (Sortieren eines Feldes)<br />
public class ArraySortOwn {<br />
/**Primitve Moeglichkeit des Sortierens eines <strong>Arrays</strong><br />
**/<br />
public static void sort(double[] nums) {<br />
//Schleife durch das Array<br />
//Suchen des kleinsten Elementes im Feld<br />
//Kleinstes Element an erste unsortierte Stelle<br />
for(int i = 0; i < nums.length; i++) {<br />
int min = i; //Suchen des kleinsten Elementes<br />
//zwischen i und dem Ende des <strong>Arrays</strong>.<br />
for(int j = i; j < nums.length; j++)<br />
if (nums[j] < nums[min]) min = j;<br />
// Tauschen des kleinsten Elementes mit i<br />
double tmp;<br />
tmp = nums[i];<br />
nums[i] = nums[min];<br />
nums[min] = tmp;<br />
}<br />
}<br />
}<br />
public static void main(String[] args) {<br />
double[] nums = new double[10]; //Arrayerzeugung<br />
for(int i = 0; i < nums.length; i++) //Zufallszahlen<br />
nums[i] = Math.random() * 100; //generieren<br />
sort(nums); //Aufruf der Instanzmethode sort<br />
for(int i = 0; i < nums.length; i++) //Ausdruck<br />
System.out.println(nums[i]);<br />
}<br />
A. Schmidt, W. Süß 10 19.10.2000
Problemorientierte Programmiersprachen - Java I SS 2000<br />
Mehrdimensionale <strong>Arrays</strong> (Felder)<br />
byte ZweiDimArray[][];<br />
• Deklaration der Variablen ZweiDimArray mit Typ byte[][] (Array-von-<br />
Array-aus-byte).<br />
byte ZweiDimArray[][] = new Byte [256][];<br />
• Dynamische Bereitstellung eines <strong>Arrays</strong> mit 256 Elementen. Jedes Element<br />
dieses neuen <strong>Arrays</strong> ist vom Typ byte[] - einem eindimensionalen<br />
Array von bytes.<br />
byte ZweiDimArray[][] = new Byte [256][16];<br />
• Dynamische Bereitstellung eines 256Bytes-<strong>Arrays</strong>, von denen jeder 16<br />
Bytes aufnehmen kann. Gleichzeitig wird eine Referenz dieser 16 byte-<br />
<strong>Arrays</strong> in den 256 Elementen des „äußeren“ <strong>Arrays</strong> gespeichert. Die 16<br />
Bytes dieser 256 <strong>Arrays</strong> werden mit dem Standardwert 0 initialisiert.<br />
Nicht Erlaubt:<br />
byte ZweiDimArray[][] = new Byte [][16];<br />
Erlaubt:<br />
• Beliebige Dimension eines mehrdimensionalen <strong>Arrays</strong>:<br />
int[][][][][] FuenfDim=new int[3][4][5][6][7];<br />
• Nicht rechteckige Form von <strong>Arrays</strong>:<br />
int ZweiDim[][]= {{1,2},{3,4,5}, {5,6,7,8}};<br />
Beispiel: (Generieren einer Matrix und Ausgabe der Matrix)<br />
public class Matrix {<br />
public static void main(String[] args) {<br />
int matrix[][]=new int[4][5];<br />
//Ausgabe der Matrix<br />
for(int i = 0; i < matrix.length; i++) {<br />
for (int j=0;j
Problemorientierte Programmiersprachen - Java I SS 2000<br />
Beispiel: (Generieren der Einheitsmatrix und Ausgabe der Einheitsmatrix)<br />
public class EinheitsMatrix {<br />
public static void main(String[] args) {<br />
int matrix[][]=new int[10][10];<br />
//Generieren der Einheitsmatrix<br />
for(int i = 0; i < matrix.length; i++)<br />
for (int j=0;j
Problemorientierte Programmiersprachen - Java I SS 2000<br />
Beispiel: (Nicht rechteckige Form eines mehrdimensionalen <strong>Arrays</strong>)<br />
public class Array2 {<br />
public static void main(String[] args) {<br />
short triangle[][]=new short[10][];<br />
for (int i=0; i < triangle.length;i++) {<br />
triangle[i] = new short[i+1];<br />
for (int j=0;j
Problemorientierte Programmiersprachen - Java I SS 2000<br />
<strong>Arrays</strong><br />
• Feste Anzahl von Komponenten<br />
• Beliebiger, aber für alle Komponenten gleicher Typ<br />
• Die Komponenten sind linear geordnet<br />
• Auf die einzelnen Komponenten kann direkt zugegriffen<br />
werden<br />
• Mehrdimensionale <strong>Arrays</strong><br />
• <strong>Arrays</strong> sind Objekte. Dennoch gibt es Unterschiede zu<br />
»normalen« Objekten.<br />
• Gemeinsamkeiten von Objekten und <strong>Arrays</strong>:<br />
• <strong>Arrays</strong> werden wie Objekte grundsätzlich dynamisch angelegt und<br />
am Ende ihrer Verwendung automatisch vom Garbage Collector<br />
entfernt.<br />
• <strong>Arrays</strong> sind wie Objekte Referenztypen.<br />
• <strong>Arrays</strong> sind wie alle Klassen implizit Unterklassen der Klasse<br />
Object. Array-Elemente werden wie die Datenelemente von<br />
Objekten auch stets automatisch initialisiert.<br />
• Unterschiede von Objekten und <strong>Arrays</strong>:<br />
• <strong>Arrays</strong> haben keine Konstruktoren. Statt dessen gibt es für <strong>Arrays</strong><br />
eine spezielle Syntax des new-Operators.<br />
• Keine Unterklassen von <strong>Arrays</strong> möglich.<br />
A. Schmidt, W. Süß 14 19.10.2000