Avatar billede rolchau Nybegynder
01. oktober 2004 - 16:44 Der er 9 kommentarer og
1 løsning

Lidt problemer med referencer

Hej,
Har lige lidt problemer med referencer. Jeg har en matrise int[][] array1, som jeg gerne vil have smidt på en stack, da den skal bruges til en undotilstand.

Problemet er bare at når matrisen er på stacken så ændres den når array1 bliver ændret udenfor stacken, så min undotilstand bliver ubrugelig...

Det jeg egentlig ville have var det her nummer:
int[][] array1 = xxxx;
int[][] array2 = array1;

Hvor begge arrays så stadigvæk var uafhængige af hinanden - Det er de bare ikke. Ændre jeg i array1 sker det også i array2 og omvendt.

Er det ikke muligt uden at skulle tage hver enkelt lille værdi og smide dem over en af gangen i det nye array?
Avatar billede arne_v Ekspert
01. oktober 2004 - 16:47 #1
Prøv:

int[][] array2 = (int[][])array1.clone();
Avatar billede rolchau Nybegynder
01. oktober 2004 - 16:54 #2
int[][] temp = (int[][])fields.clone();
temp[1][1] = 999;
System.out.println("Fields: " + fields[1][1]); <- udskriver 999
fields[1][1] = 777;
System.out.println("Temp: " + temp[1][1]); <- udskriver 777

Så de "hænger" stadig sammen.
Avatar billede laplands-ugle Nybegynder
01. oktober 2004 - 17:00 #3
Hmm skulle de ikke gøre hvis du gør:
int[][] array1 = xxxx
int[][] array2 = (int[][])array1.clone();

ligesom arne siger. Nu skulle du kunne opdatere array2 uden påvirkning af array1
Avatar billede laplands-ugle Nybegynder
01. oktober 2004 - 17:02 #4
Hov læste din kode forkert det er jo det du har forsøgt :) sorry
Avatar billede arne_v Ekspert
01. oktober 2004 - 17:05 #5
Ah.

Java 2D arrays er jo et array af arrays og clone er shallow ikke deep.

Så du bliver nødt til at lave en løkke.
Avatar billede rolchau Nybegynder
01. oktober 2004 - 17:06 #6
Prøv det her eksempel:
        int temp2[][] = new int[2][2];
        temp2[0][0] = 999;
        int temp3[][] = (int[][])temp2.clone();
        temp2[0][0] = 99;
        System.out.println(temp3[0][0]);

Den burde udskrive 999 der ik? Den udskriver bare 99 istedet =(
Avatar billede arne_v Ekspert
01. oktober 2004 - 17:06 #7
int[][] array2 = new int[array1.length][];
        for(int i = 0; i < array1.length; i++) {
            array2[i] = (int[])array1[i].clone();
        }
Avatar billede rolchau Nybegynder
01. oktober 2004 - 17:07 #8
Ah ok, bugger =(

En løkke it is then. Men svar så skal du få points
Avatar billede arne_v Ekspert
01. oktober 2004 - 17:10 #9
Mit komplette test eksempel:

public class TwoDimClone {
    public static void main(String[] args) {
        int[][] a1 = new int[2][];
        for(int i = 0; i < a1.length; i++) {
            a1[i] = new int[2];
            for(int j = 0; j < a1[i].length; j++) {
                a1[i][j] = i + j;
            }
        }
        for(int i = 0; i < a1.length; i++) {
            for(int j = 0; j < a1[i].length; j++) {
                System.out.print(" " + a1[i][j]);
            }
            System.out.println();
        }

        int[][] a2 = (int[][])a1.clone();
        a2[0][0] = -1;
        for(int i = 0; i < a1.length; i++) {
            for(int j = 0; j < a1[i].length; j++) {
                System.out.print(" " + a1[i][j]);
            }
            System.out.println();
        }

        int[][] a3 = new int[a1.length][];
        for(int i = 0; i < a1.length; i++) {
            a3[i] = (int[])a1[i].clone();
        }
        a3[1][1] = -1;
        for(int i = 0; i < a1.length; i++) {
            for(int j = 0; j < a1[i].length; j++) {
                System.out.print(" " + a1[i][j]);
            }
            System.out.println();
        }
    }
}
Avatar billede arne_v Ekspert
01. oktober 2004 - 17:10 #10
og et svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester