Hallo zusammen,
in unserem Skript gibt es drei Seiten, die mich völlig verwirren. Ich poste sie und stell jeweils die Fragen, die ich zur Folie habe darunter.
Nach meinem Verständnis des Programms sollte eher das rauskommen
da wenn ich es richtig verstanden habe, wird zuerst der Vektor kopiert und erst in Zeile 17 wird die Zeile b mit 100 ausgetauscht.
Was ist eine Referenz?
Warum sind data und copy verschieden?
Mir ist rätselhaft, wie man auf
1
2
-4
1
kommt. Ich hab es mit den vier Grundrechenarten probiert, aber immer andere Ergebnisse rausbekommen.
Edit: Ihr würdet mir auch schon weiterhelfen, wenn ihr nur zu einem Blatt antwortet
in unserem Skript gibt es drei Seiten, die mich völlig verwirren. Ich poste sie und stell jeweils die Fragen, die ich zur Folie habe darunter.
6.6. KLONEN VON ARRAYS
6.6 Klonen von Arrays
Statt wie bislang Arrays zu kopieren, kann man mit der Methode clone() ein identisches
Abbild im Speicher erstellen. So wie die Wertzuweisung nur die Referenzen kopiert, so vergleicht
der Gleichheits-Operator == auch nur die Referenzen auf Gleichheit. Für Arrays
gibt es in der Klasse Arrays die (Klassen-) Methode Arrays.equals() . Die Methode clone()
wird in der Wurzelklasse Object definiert und von der aus dieser Klasse abgeleiteten
Arrays geerbt! Ihr Rückgabewert ist eine Referenz auf Object und muss dann auf Arrays
ge-cast-et werden! Diese neue Referenz referenziert den Klon!
Programm 6.15, , zeigt eine kleine Anwendung.
Programm 6.15: Klonen und Vergleichen (ArrayClone.java)
Übersetzung und Ausführung:Java:1 import java.util.Arrays; // wegen Arrays.equals() 2 3 public class ArrayClone { 4 public static void main(String[] args) { 5 6 int [] a = {1,2,3}; 7 int [] b = (int []) a.clone (); 8 if (a == b ) 9 System.out.println( "a and b are equal"); 10 else 11 System.out.println( "a and b are not equal"); 12 if (Arrays.equals(a,b) ) 13 System.out.println( "a and b are equivalent"); 14 else 15 System.out.println( "a and b are not equivalent"); 16 17 b[1] = 100; 18 if (Arrays.equals(a,b) ) 19 System.out.println( "a and b are equivalent"); 20 else 21 System.out.println( "a and b are no longer equivalent"); 22 23 for (int i = 0; i < a.length; i++) 24 System.out.println( "a[" + i + " ] = " + a[ i ] + " / b[" + i + " ] = " + b[ i ]); 25 System.out.println (); 26 } 27 }
Code:spatz$ javac ArrayClone.java spatz$ java ArrayClone a and b are not equal a and b are equivalent a and b are no longer equivalent a[0] = 1 / b[0] = 1 a[1] = 2 / b[1] = 100 a[2] = 3 / b[2] = 3 spatz$
Nach meinem Verständnis des Programms sollte eher das rauskommen
Code:
a and b are equal
a and b are equivalent
a and b are no longer equivalent
a[0] = 1 / b[0] = 1
a[1] = 2 / b[1] = 100
a[2] = 3 / b[2] = 3
da wenn ich es richtig verstanden habe, wird zuerst der Vektor kopiert und erst in Zeile 17 wird die Zeile b mit 100 ausgetauscht.
Was ist eine Referenz?
KAPITEL 6. ARRAY
Klonen bei mehrdimensionalen Arrays zeigt beispielhaft Programm 6.16, S. 114.
Programm 6.16: Klonen mehrdimensionaler Arrays (ArrayClone1.java)
Übersetzung und Ausführung:Java:1 import java.util .∗; 2 3 public class ArrayClone1 { 4 public static void main(String[] args) { 5 6 int [][] data = {{1,2,3,4}, {5,6}, {7,8,9}}; 7 // Kopie vorbereiten 8 int [][] copy = new int[data.length][]; 9 // Referenzen klonen 10 for(int i =0; i < data.length; i++) 11 copy[ i ] = (int []) data[i ]. clone (); 12 if (Arrays.equals(data,copy) ) 13 System.out.println( "data and copy are equivalent"); 14 else 15 System.out.println( "data and copy are not equivalent"); 16 for(int i = 0; i < copy.length; i++) { 17 for(int j = 0; j < copy[ i ]. length; j++) 18 System.out.print( "" + copy[i ][ j ] + " " ); 19 System.out.println (); 20 } 21 } 22 }
Anm.: Es ist klar, dass data und copy nicht identisch sind – die Referenzen in der erstenCode:spatz$ javac ArrayClone1.java spatz$ java ArrayClone1 data and copy are not equivalent 1 2 3 4 5 6 7 8 9 spatz$
Dimension sind verschieden!
Warum sind data und copy verschieden?
Programm 6.19: Lösung eines linearen Gleichungssystems (LinGleichung.java)
Java:1 import java.util.Formatter; 2 import Jama.Matrix; 3 public class LinGleichung{ 4 public static void main(String[] args) { 5 int dim = 4; 6 double[][] a = { {2,1,0,1}, 7 {1,2,4,1}, 8 {0,1,3,1}, 9 {1,3,1,0} 10 }; 11 double [] b = {5,−10,−9,3}; 12 Formatter fmt = new Formatter(System.out); 13 Matrix A = new Matrix(a); 14 Matrix B = new Matrix(b,4); 15 Matrix X = A.solve (B); 16 for (int i = 0; i < dim; i++){ 17 fmt.format("%6.2f\n", X.get ( i ,0)); 18 } 19 } 20 }
In Zeile 2 wird aus dem Paket „Jama“ die Klasse „Matrix“ importiert.Code:irazu$ javac LinGleichung.java irazu$ java LinGleichung 1.00 2.00 -4.00 1.00 irazu$
In Zeile 13 definieren wird das Objekt A zur Klasse Matrix definiert und mit den Werten
aus dem zweidimensionalen Array a initialisiert.
In Zeile 14 passiert fast dasselbe, nur dass die Initialisierung aus einem eindimensionalen
Array mit den ersten 4 Werten erfolgt.
In Zeile 15 wird die Variable X zur Klasse Matrix definiert und mit dem Ergebnis des Aufrufes
A.solve(B) belegt: benutze die Methode solve() am Objekt A (als Matrix des Gleichungssystemes)
mit der rechten Seite B.
In Zeile 17 holen wir mit X.get(i,0) vom Objekt X das Element in der i-ten Zeile und 0-
ten Spalte!
Mir ist rätselhaft, wie man auf
1
2
-4
1
kommt. Ich hab es mit den vier Grundrechenarten probiert, aber immer andere Ergebnisse rausbekommen.
Edit: Ihr würdet mir auch schon weiterhelfen, wenn ihr nur zu einem Blatt antwortet
Zuletzt bearbeitet: