kopiowanie zaawartosci z tablicy1 do tablicy2

0

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?

0

System.arrayCopy() ?

0
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 :)

0

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ć?

0

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.

0
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,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ć?

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

0

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

0

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. :-/

1 użytkowników online, w tym zalogowanych: 0, gości: 1