Kopírovat 2D pole v Javě
Kdykoli se pokoušíme zkopírovat prvky 2D pole do jiného pole, často přiřadíme cílovému poli původní pole. Proč je tento přístup logicky nesprávný, o tom nejprve probereme.
I když je níže uvedené řešení logicky nesprávné, chceme vám dát vědět, proč toto řešení nefunguje.
// Java Program to copy 2-dimensional array
// create 2D array
int [ ][ ] arr1 = { {2,4,6}, {8,10,12} };
// creating the same array with the same size
int [ ] [ ] arr2 = new int[arr1.length];
// this code does not copy elements of arr1[ ] to arr2[ ] because arr2[ ] sill refer to the same location
arr2 = arr1;
Když napíšeme arr2=arr1
, přiřazujeme arr2[ ]
odkaz na arr1[ ]
. Změna jednoho pole se proto projeví v zkopírovaném i původním poli, protože obě pole směřují na stejné místo.
Chcete-li tuto skutečnost demonstrovat, podívejte se na kód zobrazený níže.
// A Java program to demonstrate assigning an array reference doesn't make any sense
public class copy2DArray{
public static void main(String []args){
// Create an array arr1[]
int [][] arr1 = { {2,4,5}, {6,8,10} };
// Create an array arr2[] with the same size
int [][] arr2 = new int[arr1.length][];
// Doesn't copy elements of arr1 to arr2, but only arr2 starts refering arr1
arr2 = arr1;
// Any changing in the arr2 also reflects in the arr1 because
// both are referin to the same location
arr2 [0][0] = 88;
System.out.println("Elements of arr1[] are:");
for (int i=0; i<arr1.length; i++){
for (int j=0; j<arr1.length; j++){
System.out.println(arr1[i][j] + " ");
}
}
System.out.println("\n\nElements of arr2[] are:");
for (int i=0; i<arr2.length; i++){
for (int j=0; j<arr2.length; j++){
System.out.println(arr2[i][j] + " ");
}
}
}
}
Výstup:
Elements of arr1[] are:
88
4
6
8
Elements of arr2[] are:
88
4
6
8
Ve výše uvedeném příkladu jsme diskutovali o běžných chybách, které vývojáři často dělají při kopírování prvků 2D pole. Nyní probereme správnou metodu k provedení stejného úkolu.
V Javě můžeme kopírovat prvky pole pomocí následujících metod:
- Iterujte všechny prvky pole a zkopírujte každý prvek.
- Pomocí
clone()
metoda. - Pomocí
arraycopy()
metoda.
Použití opakování smyčky ke kopírování 2D pole v Javě
Technika opakování smyčky pro kopírování 2D pole. Při použití této metody zjistíte, že jakákoli úprava cíle nebo původního pole neovlivní původní pole. Původní pole tedy zůstane nedotčeno.
// A Java program to demonstrate assigning an array reference doesn't make any sense
import java.util.Arrays;
public class copy2DArray{
public static void main(String [ ]args){
// Create an array arr1[ ]
int [ ][ ] arr1 = { {2,4,5}, {6,8,10} };
// Create an array arr2[ ] with the same size
int [ ][ ] arr2 = new int[arr1.length][ ];
// Copying elements of arr1[ ] to arr2[ ]
for(int i = 0; i < arr1.length; i++){
// allocation space to each row of arr2[]
arr2[i] = new int[arr1[i].length];
for(int j= 0; j<arr1[i].length; j++){
arr2[i][j] = arr1[i][j];
}
}
// Any change in the elements of arr2[ ] will not be reflected in an original array
arr2[0][0] = 90;
System.out.println("Elements of arr1[] are:");
for (int i=0; i < arr1.length; i++){
for (int j=0; j < arr1[0].length; j++){
System.out.println(arr1[i][j] + " ");
}
}
System.out.println("\n\nElements of arr2[] are:");
for (int i=0; i < arr2.length; i++){
for (int j=0; j < arr2[0].length; j++){
System.out.println(arr2[i][j] + " ");
}
}
}
}
Výstup:
Elements of arr1[] are:
2
4
5
6
8
10
Elements of arr2[] are:
90
4
5
6
8
10
Použití clone()
Metoda kopírování 2D pole v Javě
V předchozí metodě jsme použili techniku opakování smyčky ke kopírování prvků 2D pole. Stejný úkol můžeme provést s clone()
metoda.
// A Java program to demonstrate assigning an array reference doesn't make any sense
import java.util.Arrays;
public class copy2DArray{
public static void main(String []args){
// Create an array arr1[]
int [ ][ ] arr1 = { {2,4,5}, {6,8,10} };
// Create an array arr2[] with the same size
int [ ][ ] arr2 = new int[arr1.length][];
// Copying elements of arr1[ ] to arr2[ ] using the clone() method
for(int i = 0; i < arr1.length; i++)
arr2[i] = arr1[i].clone();
// Any change in the elements of arr2[] will not be reflected in an original array
arr2[0][0] = 90;
System.out.println("Elements of arr1[] are:");
for (int i=0; i < arr1.length; i++){
for (int j=0; j < arr1[0].length; j++){
System.out.println(arr1[i][j] + " ");
}
}
System.out.println("\n\nElements of arr2[] are:");
for (int i=0; i < arr2.length; i++){
for (int j=0; j < arr2[0].length; j++){
System.out.println(arr2[i][j] + " ");
}
}
}
}
Výstup:
Elements of arr1[] are:
2
4
5
6
8
10
Elements of arr2[] are:
90
4
5
6
8
10
Pomocí arraycopy()
Metoda kopírování 2D pole v Javě
Podobně můžeme kopírovat 2D pole pomocí arraycopy()
metoda. Pomocí této metody můžeme kopírovat prvky libovolného 2D pole, aniž bychom museli opakovat všechny prvky pole. Chcete-li použít tuto metodu, musíme zadat následující parametry:
src
:zdrojové pole, které potřebujete zkopírovatsrcPos
:počáteční umístění původního pole.dest
:cílové pole.destPos
:počáteční index cílového pole.length
:celkový počet prvků 2D pole, které chceme zkopírovat
Výjimka:
NullPointerException
:pokud zdrojové nebo cílové pole není definováno nebo neexistuje.ArrayStoreException
:Pokud se vývojář pokusí zkopírovat typ pole typu integer do pole řetězců, tato situace automaticky spustí tuto výjimku.
Příklad:
package sampleProject;
import java.util.Arrays;
public class Codesample {
public static void main(String []args){
// Create an array arr1[]
int [][] arr1 = { {2,4,5}, {6,8,10} };
// Create an array arr2[] with the same size
int [][] arr2 = new int[arr1.length][];
// Copying elements of arr1[] to arr2[] using the clone() method
for(int i = 0; i < arr1.length; i++) {
arr2[i] = new int[arr1[i].length];
System.arraycopy(arr1[i], 0, arr2[i], 0, arr1[i].length);
}
// Any change in the elements of arr2[] will not be reflected in an original array
arr2[0][0] = 90;
System.out.println("Elements of arr1[] are:");
for (int i=0; i < arr1.length; i++){
for (int j=0; j < arr1[0].length; j++){
System.out.println(arr1[i][j] + " ");
}
}
System.out.println("\n\nElements of arr2[] are:");
for (int i=0; i < arr2.length; i++){
for (int j=0; j < arr2[0].length; j++){
System.out.println(arr2[i][j] + " ");
}
}
}
}
Výstup:
Elements of arr1[] are:
2
4
5
6
8
10
Elements of arr2[] are:
90
4
5
6
8
10