English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
このチュートリアルでは、Javaで配列(一次元および二次元)をコピーするための異なる方法を、サンプルの助けにより学びます。
Javaでは、配列を別の配列にコピーすることができます。Javaで配列をコピーするために使用できる技術はいくつかあります。
例を示しましょう
class Main { public static void main(String[] args) { int[] numbers = {1, 2, 3, 4, 5, 6}; int[] positiveNumbers = numbers; //配列をコピーします for(int number : positiveNumbers) { System.out.print(number + ""); } } }
出力:
1, 2, 3, 4, 5, 6
上記の例では、numbers配列をpositiveEnumbers配列にコピーするために、名前がnumbersの配列を名前がpositiveEnumbersの配列にコピーするために、代入演算子(=)を使用しました。
この技術は最もシンプルな方法の1つですが、効果的です。しかし、この技術には問題があります。配列の要素を変更すると、他の配列の対応する要素も変更されます。例えば、
class Main { public static void main(String[] args) { int[] numbers = {1, 2, 3, 4, 5, 6}; int[] positiveNumbers = numbers; //配列をコピーします //第1つの配列の値を変更します numbers[0] = -1; //第2つの配列を印刷します for(int number : positiveNumbers) { System.out.print(number + ""); } } }
出力:
-1, 2, 3, 4, 5, 6
ここでは、numbers配列の1つの値が変更されたことがわかります。positiveNumbers配列を印刷すると、同じ値が変更されたこともわかります。
これは、2つの配列が同じ配列オブジェクトを参照しているためです。これは浅いコピーのためにです。浅いコピーに関する詳細情報を知りたい場合は、以下のURLにアクセスしてください。浅いコピー。
現在、配列をコピーする際に新しい配列オブジェクトを生成する必要があるため、浅いコピーではなく深いコピーを行う必要があります。
例を示しましょう:
import java.util.Arrays; class Main { public static void main(String[] args) { int[] source = {1, 2, 3, 4, 5, 6}; int[] destination = new int[6]; //要素をソースからターゲットにコピーし、反復します for (int i = 0; i < source.length; ++i) { destination[i] = source[i]; } //配列を文字列に変換 System.out.println(Arrays.toString(destination)); } }
出力:
[1, 2, 3, 4, 5, 6]
上記の例では、forループを使用してソース配列の各要素を巡回しました。各イテレーションで、ソース配列からdestination配列に要素をコピーしました。
ここでは、ソースとターゲット配列は異なるオブジェクトを参照しています(深いコピー)。したがって、配列の要素が変更された場合、もう一方の配列の対応する要素も変更されません。
次の文に注意してください、
System.out.println(Arrays.toString(destination));
ここでは、toString()メソッドは配列を文字列に変換するために使用されています。
Javaでは、Systemクラスパッケージには、arraycopy()メソッドを用いて配列をコピーするためのメソッドが含まれています。上記の2つの方法に比べて、これは配列をコピーするためのより良い方法です。
メソッドは、ソース配列の指定された部分をターゲット配列にコピーすることができます。例えば、
arraycopy(Object src, int srcPos,Object dest, int destPos, int length)
ここでは、
src -コピーしたいソース配列
srcPos -ソース配列の開始位置(インデックス)
dest -ターゲット配列、ソースから要素をコピー
destPos -ターゲット配列の開始位置(インデックス)
length -コピーする要素の数
例を示しましょう:
//Arrays.toString()メソッドを使用して import java.util.Arrays; class Main { public static void main(String[] args) { int[] n1 = {2, 3, 12, 4, 12, -2}; int[] n3 = new int[5]; //長さがn1のn2配列 int[] n2 = new int[n1.length]; //全体のn1配列をnにコピー2 System.arraycopy(n1, 0, n2, 0, n1.length); System.out.println("n2 = " + Arrays.toString(n2)); //からn1配列のインデックス2コピー要素 //をnにコピー3配列のインデックス1 //をコピー2個の要素 System.arraycopy(n1, 2, n3, 1, 2); System.out.println("n3 = " + Arrays.toString(n3)); } }
出力:
n2 = [2, 3, 12, 4, 12, -2] n3 = [0, 12, 4, 0, 0]
上記の例では、arraycopy()メソッドを使用しました。
System.arraycopy(n1, 0, n2, 0, n1.length) - nを1配列の全ての要素がnにコピーされます2配列中
System.arraycopy(n1, 2, n3, 1, 2 )- インデックスから2始まるn1配列の2つの要素がnからコピーされます3配列1始めのインデックスに
ご覧の通り、int型配列の要素のデフォルトの初期値は0です。
.使用copyOfRange()メソッドで配列をコピーさらに、以下を使用できます。Java Arrays
//toString()とcopyOfRange()メソッドを使用して、クラス内で定義されたcopyOfRange()メソッドを使用して配列をコピーします。例えば、 import java.util.Arrays; class ArraysCopy { public static void main(String[] args) { int[] source = {2, 3, 12, 4, 12, -2}; //元の配列全体をコピーして、ターゲットに配置します。 int[] destination1 = Arrays.copyOfRange(source, 0, source.length); System.out.println("destination1 = " + Arrays.toString(destination1)); //インデックスから2にコピーする5(5) int[] destination2 = Arrays.copyOfRange(source, 2, 5); System.out.println("destination2 = " + Arrays.toString(destination2)); } }
出力結果
destination1 = [2, 3, 12, 4, 12, -2] destination2 = [12, 4, 12]
上記の例では、以下の行に注意してください:
int[] destination1 = Arrays.copyOfRange(source, 0, source.length);
ここでは、destinationの作成が見られます1配列をコピーして同時に元の配列をそれにコピーします。copyOfRange()メソッドを呼び出す前に、destinationは作成されません。1メソッドの詳細については、以下のURLを参照してください。Java copyOfRange。
一次元配列と同様に、二次元配列もforループを使用してコピーできます。例えば、
import java.util.Arrays; class Main { public static void main(String[] args) { int[][] source = {" {1, 2, 3, 4}, {5, 6}, {0, 2, 42, -4, 5} }; int[][] destination = new int[source.length][]; for (int i = 0; i < destination.length; ++i) { //ターゲット配列の各行にスペースを割り当てます。 destination[i] = new int[source[i].length]; for (int j = 0; j < destination[i].length; ++j) { destination[i][j] = source[i][j]; } } //ターゲット配列を表示 System.out.println(Arrays.deepToString(destination)); } }
出力:
[[1, 2, 3, 4], [5, 6], [0, 2, 42, -4, 5]]
上記のプログラムでは、以下の行に注意してください:
System.out.println(Arrays.deepToString(destination);
ここでは、deepToString()メソッドを使用して二次元配列のより良い表示を提供します。さらに詳しい情報は、以下のURLを参照してください。Java deepToString()。
为了使上面的代码更簡単,System.arraycopy()を使用して内部ループを置き換えることができます。一次元配列のように処理できます。例えば、
import java.util.Arrays; class Main { public static void main(String[] args) { int[][] source = {" {1, 2, 3, 4}, {5, 6}, {0, 2, 42, -4, 5} }; int[][] destination = new int[source.length][]; for (int i = 0; i<source.length; ++i) { //ターゲット配列の各行にスペースを割り当てます。 destination[i] = new int[source[i].length]; System.arraycopy(source[i], 0, destination[i], 0, destination[i].length); } //ターゲット配列を表示 System.out.println(Arrays.deepToString(destination)); } }
出力:
[[1, 2, 3, 4], [5, 6], [0, 2, 42, -4, 5]]
ここでは、arraycopy()メソッドを使用して内部のforループを置き換えることで、同じ出力を得ることができます。