Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
habe folgendes "Problem" zu lösen. Ich habe eine Klasse, in der zwei Konstruktoren vorhanden sind.
Der erste dient dazu ein Array manuell mit Leben zu füllen und anschließend an andere Methoden zur Verarbeitung weiterzugeben:
Java:
public Matrix(int rows, int cols) {
matrix = new double[rows][cols];
}
Der zweite Konstruktor soll ein fertig gefülltes Array bekommen um dieses dann an den ersten Konstruktor weiterzugeben welcher dann ja für die Berechnungen benutzt wird.
Java:
public Matrix(double[][] m) {
}
Da ich das ganze nicht direkt x-mal testen kann(bzw nicht weiß wie), wenn ein Array von außen gegeben wird, frag ich euch um Hilfe.
Habe nach google und forumssuche natürlich die Befehle clone und arraycopy gefunden. Bin aber nicht sicher wie ich die hier auf die Konstruktoren anwenden soll.
Hab jetzt an sowas hier gedacht:
Java:
public Matrix(double[][] m) {
matrix = m.clone();
}
ich glaube so wie phl das sagt geht es nicht. weil ein array kein primitiver datentyp ist und du deshalb die referenz auf das obejekt gleich setzt. du duplizierst das array also nicht sondern veränderst sozusagen nur seinen variablennamen.
ich hab das einfach mit schleifen gemacht in etwa so:
Java:
public void cloneArray(int[][] a, int rows, int cols){
int[][] b = new int[rows][cols];
int x = 0;
int y = 0;
while (y<rows){
while (x<rows){
b[x][y] = a[x][y];
x++;
}
x = 0;
y++;
}
return b;
}
geht vielleicht mit for schleifen einfacher aber ich mag die nich so gern
double d[][] = new double[][]{{ 1,2 }, {3, 4}};
Matrix m = new Matrix(d);
System.out.println(m.get(0,0)); // Gibt '1' aus
d[0][0] = 123;
System.out.println(m.get(0,0)); // Gibt '123' aus
D.h. man hätte "außerhalb" immer noch eine Referenz auf den Inhalt der Matrix. Das kann "gefährlich" sein, und unerwünschte Effekte nach sich ziehen. Was du suchst war vermulich sowas wie
Java:
public Matrix(double[][] m)
{
matrix = new double[m.length][];
for (int i=0; i<m.length; i++)
{
matrix[i] = m[i].clone();
}
}
Damit wird eine echte Kopie des übergebenen Arrays erzeugt.
@marco
@wuella
Ich denke sowas muss hin. Sieht in meinen Anfängeraugen auch richtig aus. Nur, bei Marcos Version wird nur einen Dimension kopiert oder seh ich das falsch? Bei der Wuella-Version werden ja beide Dimensionen mittels und [j] übergeben.
Oder hab ich da nun einen Interpretationsfehler drin?
Bei Wuellas lösung wird ein neuer 2D-Array der passenden Größe erstellt, und dann die Elemente einzeln kopiert. Bei meiner Lösung werden die Zeilen (mit clone()) jweils auf einen Schlag kopiert.
Das hat IMHO Vorteile... das funktioniert auch mit Arrays der Größe 0x0 und insbesondere bei nicht-rechteckigen Arrays (für Dreiecksmatrizen z.B. )