Witam
tak zastanawiam sie od wczoraj jak skopiować zawartość tablicy bez kopiowania referencji. czy musze sie odwołać do każdej komórki bezpośrednio i zapętlić to wszystko czy istnieje jakiś wygodny sposób?
Witam
tak zastanawiam sie od wczoraj jak skopiować zawartość tablicy bez kopiowania referencji. czy musze sie odwołać do każdej komórki bezpośrednio i zapętlić to wszystko czy istnieje jakiś wygodny sposób?
System.arrayCopy() ?
import javax.swing.JApplet;
public class NewClass extends JApplet {
@Override
public void init(){
int tab1[] = new int[20];
int tab2[] = new int[20];
tab1[1]=11;
tab1[2]=22;
tab1[3]=33;
System.out.println("tab1 "+tab1[1]+" "+tab1[2]+" "+tab1[3]+" ");
System.out.println("tab2 "+tab2[1]+" "+tab2[2]+" "+tab2[3]+" ");
System.arraycopy(tab1, 0, tab2, 0, tab1.length);
tab1[1]=44;
tab1[2]=44;
tab1[3]=44;
System.out.println("tab1 "+tab1[1]+" "+tab1[2]+" "+tab1[3]+" ");
System.out.println("tab2 "+tab2[1]+" "+tab2[2]+" "+tab2[3]+" ");
}
}
oki dzieki dziala a to malutki przykladzik jak by ktos szukal :)
mam jeszcze malutkie pytanko
kopiujemy talice 1 wymiarowa do tablicy 2 wymiarowej odwolamy sie po przez index
System.arraycopy(tab1, 0, tab3[0], 0, tab1.length);
i można powiedzieć ze tu sie kopiuje tablica w poziomie tzn.
0,0 0,1 0,2 0,3
1,0 1,1 1,2 1,3
2,0 2,1 2,2 2,3
3,0 3,1 3,2 3,3
jeśli sie odwołamy tak jak w przykładzie tab3[0] to zostanie wrzucone w indexy 0,0 0,1 0,2 0,3 a jak bym chcial skopiwac w pionie do komorek np. 0,0 1,0 2,0 3,0 czy da sie taka operacje tez poleceniem wykonać?
Da się, tylko będziesz musiał kopiować 4 razy po jednym elemencie. Miałoby to jakiś sens gdyby tablica była więcej 3- lub więcej wymiarowa.
mgs_saladin napisał(a)
mam jeszcze malutkie pytanko
kopiujemy talice 1 wymiarowa do tablicy 2 wymiarowej odwolamy sie po przez index
System.arraycopy(tab1, 0, tab3[0], 0, tab1.length);
i można powiedzieć ze tu sie kopiuje tablica w poziomie tzn.
0,0 0,1 0,2 0,3
1,0 1,1 1,2 1,3
2,0 2,1 2,2 2,3
3,0 3,1 3,2 3,3jeśli sie odwołamy tak jak w przykładzie tab3[0] to zostanie wrzucone w indexy 0,0 0,1 0,2 0,3 a jak bym chcial skopiwac w pionie do komorek np. 0,0 1,0 2,0 3,0 czy da sie taka operacje tez poleceniem wykonać?
W Javie tablica zdefiniowana jako dwuwymiarowa jest tablicą tablic. Pod indeksem 0 znajduje się pierwsza tablica, pod indeksem 1 znajduje się druga - i tak dalej.
Kopiowanie w poziomie to kopiowanie do jednej z tablic pod wybranym indeksem, możesz dokonać tego przy pomocy arraycopy. Nie możesz za to wstawiać elementów jednym wywołaniem arraycopy do wielu tablic. Jeśli chcesz np. zapisać dane w drugiej kolumnie, musisz wstawić po jednej wartości na pozycji 2 do każdej tablicy w tablicy tablic.
Pozdrawiam,
efrac
A jeśli bym chciał pobrać wartości z własnej funkcji? Gdzie typ zwracany jest tablica dwu wymiarowa? Jak skopiować takie coś?
import javax.swing.JApplet;
public class kopiowani_tablic extends JApplet {
int tab4[][] = new int[4][4];
@Override public void init(){
int tab3[][] = new int[4][4];
System.out.println("================= tab3 =================");
System.out.println("tab0x "+tab3[0][0]+" "+tab3[0][1]+" "+tab3[0][2]+" "+tab3[0][3]+" ");
System.out.println("tab1x "+tab3[1][0]+" "+tab3[1][1]+" "+tab3[1][2]+" "+tab3[1][3]+" ");
System.out.println("tab2x "+tab3[2][0]+" "+tab3[2][1]+" "+tab3[2][2]+" "+tab3[2][3]+" ");
System.out.println("tab3x "+tab3[3][0]+" "+tab3[3][1]+" "+tab3[3][2]+" "+tab3[3][3]+" ");
System.arraycopy(moja_fukcja(), 0, tab3, 0, 4);
System.out.println("================= tab3 =================");
System.out.println("tab3: ");
System.out.println("tab0x "+tab3[0][0]+" "+tab3[0][1]+" "+tab3[0][2]+" "+tab3[0][3]+" ");
System.out.println("tab1x "+tab3[1][0]+" "+tab3[1][1]+" "+tab3[1][2]+" "+tab3[1][3]+" ");
System.out.println("tab2x "+tab3[2][0]+" "+tab3[2][1]+" "+tab3[2][2]+" "+tab3[2][3]+" ");
System.out.println("tab3x "+tab3[3][0]+" "+tab3[3][1]+" "+tab3[3][2]+" "+tab3[3][3]+" ");
System.out.println("================= tab4 =================");
System.out.println("tab0x "+tab4[0][0]+" "+tab4[0][1]+" "+tab4[0][2]+" "+tab4[0][3]+" ");
System.out.println("tab1x "+tab4[1][0]+" "+tab4[1][1]+" "+tab4[1][2]+" "+tab4[1][3]+" ");
System.out.println("tab2x "+tab4[2][0]+" "+tab4[2][1]+" "+tab4[2][2]+" "+tab4[2][3]+" ");
System.out.println("tab3x "+tab4[3][0]+" "+tab4[3][1]+" "+tab4[3][2]+" "+tab4[3][3]+" ");
tab3[0][0]=9999;
System.out.println("================= tab4 =================");
System.out.println("tab0x "+tab4[0][0]+" "+tab4[0][1]+" "+tab4[0][2]+" "+tab4[0][3]+" ");
System.out.println("tab1x "+tab4[1][0]+" "+tab4[1][1]+" "+tab4[1][2]+" "+tab4[1][3]+" ");
System.out.println("tab2x "+tab4[2][0]+" "+tab4[2][1]+" "+tab4[2][2]+" "+tab4[2][3]+" ");
System.out.println("tab3x "+tab4[3][0]+" "+tab4[3][1]+" "+tab4[3][2]+" "+tab4[3][3]+" ");
}
public int[][] moja_fukcja(){
tab4[0][0]=1; tab4[0][1]=2; tab4[0][2]=3; tab4[0][3]=4;
tab4[1][0]=5; tab4[1][1]=6; tab4[1][2]=7; tab4[1][3]=8;
tab4[2][0]=9; tab4[2][1]=10; tab4[2][2]=11; tab4[2][3]=12;
return tab4;
}
}
Zwracana jest niestety referencja. Pytam sie pod katem jakiegoś ułatwienia bo wiem ze można to obejść ustawiając wszystkie wartości w jednej tablicy a po pobraniu można je posegregować co jest dużą stratą czasu i utratą na czytelności kodu
To co napisał kolega o tym, że w Javie tablica dwuwymiarowa, to tablica tablic jest niestety uproszczeniem i ściśle mówiąc nie jest prawdą.
W rzeczywistości tablica dwuwymiarowa (i każda o większym stopniu) jest tablicą referencji do tablic. Wynika to z tego faktu, że :> tablica jest obiektem. Każda tablica - nawet ta z elementami nieobiektowymi - jest obiektem. A wszystkie obiekty przechowywane są na stercie i jedynym sposobem dostępu do elementów jest odwołanie się do nich przez referencję obiektu oraz indeks. Nie ma więc też ogólnego sposobu na skopiowanie tablicy nieznanych obiektów - a to dlatego, że klasa Object nie posiada publicznej metody clone() (posiada tylko wersję chronioną z kopiowaniem płytkim, którą można użyć lub przesłonić). W ogólnym przypadku jest możliwe jedynie skopiowanie tablicy z elementami nieobiektowymi (zaliczając do nich referencje obiektów) - i to właśnie potrafi zrobić arrayCopy().
Inaczej mówiąc można skopiować tablicę elementów, które chcą się kopiować - czyli tablice elementów, które implementują interfejs Cloneable. Przy czym same tablice jako obiekty zawsze implementują ten interfejs (stara się o to kompilator), ale ich elementy już niekoniecznie. Tak więc wielowymiarowe tablice z elementami nieobiektowymi są zawsze kopiowalne, a z obiektowymi nie zawsze.
Ciebie z w sumie interesowało czy tablica jest jednym, spójnym miejscem w pamięci czy nie. Ogólnie nie. Zawsze więc musisz użyć jakiejś pętli, chyba, że tablica jest prosta, jednowymiarowa i użyjesz arrayCopy(). System.arrayCopy potrafi też kopiować tablice obiektów (jak tablice wielowymiarowe), ale wtedy i tak używa pętli - tyle, że w swoim własnym kodzie (natywnym).
Wystarczy ględzenia. :-/