工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Industrial programming >> Java

Java コピー配列

Java コピー配列

このチュートリアルでは、例を使用して、Java で配列 (1 次元と 2 次元の両方) をコピーするために使用できるさまざまな方法について学習します。

Java では、ある配列を別の配列にコピーできます。 Java で配列をコピーするために使用できる手法がいくつかあります。


1.代入演算子を使用した配列のコピー

例を挙げましょう

class Main {
    public static void main(String[] args) {
       
        int [] numbers = {1, 2, 3, 4, 5, 6};
        int [] positiveNumbers = numbers;    // copying arrays

        for (int number: positiveNumbers) {
            System.out.print(number + ", ");
        }
    }
}

出力 :

1, 2, 3, 4, 5, 6

上記の例では、代入演算子 (=) を使用しています。 ) numbers という名前の配列をコピーするには positiveNumbers という名前の別の配列に .

この手法は最も簡単な手法であり、同様に機能します。ただし、この手法には問題があります。 1 つの配列の要素を変更すると、他の配列の対応する要素も変更されます。たとえば、

class Main {
    public static void main(String[] args) {
      
        int [] numbers = {1, 2, 3, 4, 5, 6};
        int [] positiveNumbers = numbers;    // copying arrays
      
        // change value of first array
        numbers[0] = -1;

        // printing the second array
        for (int number: positiveNumbers) {
            System.out.print(number + ", ");
        }
    }
}

出力 :

-1, 2, 3, 4, 5, 6

ここで、numbers の 1 つの値を変更したことがわかります。 配列。 positiveNumbers を出力するとき 配列、同じ値も変更されていることがわかります。

これは、両方の配列が同じ配列オブジェクトを参照しているためです。これは、浅いコピーが原因です。シャロー コピーの詳細については、シャロー コピーにアクセスしてください。

ここで、配列をコピーしながら新しい配列オブジェクトを作成するには、浅いコピーではなく深いコピーが必要です。


2.ループ コンストラクトを使用して配列をコピーする

例を見てみましょう:

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];

        // iterate and copy elements from source to destination
        for (int i = 0; i < source.length; ++i) {
            destination[i] = source[i];
        }
      
         // converting array to string
        System.out.println(Arrays.toString(destination));
    }
}

出力 :

[1, 2, 3, 4, 5, 6]

上記の例では、for を使用しています。 ループして、ソース配列の各要素を反復処理します。各反復で、ソース から要素をコピーしています 目的地への配列

ここでは、コピー元とコピー先の配列が異なるオブジェクト (ディープ コピー) を参照しています。したがって、ある配列の要素が変更された場合、別の配列の対応する要素は変更されません。

声明に注目してください、

System.out.println(Arrays.toString(destination));

ここでは、 toString() メソッドを使用して配列を文字列に変換しています。詳細については、toString() メソッド (公式の Java ドキュメント) を参照してください。


3. arraycopy() メソッドを使用した配列のコピー

Java では、System クラスに arraycopy() という名前のメソッドが含まれています。 配列をコピーします。この方法は、上記の 2 つよりも配列をコピーするための優れた方法です。

arraycopy() メソッドを使用すると、コピー元配列の指定した部分をコピー先配列にコピーできます。たとえば、

arraycopy(Object src, int srcPos,Object dest, int destPos, int length)

ここで、

例を見てみましょう:

// To use Arrays.toString() method
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];

        // Creating n2 array of having length of n1 array
        int[] n2 = new int[n1.length];
      
        // copying entire n1 array to n2
        System.arraycopy(n1, 0, n2, 0, n1.length);
        System.out.println("n2 = " + Arrays.toString(n2));  
      
        // copying elements from index 2 on n1 array
        // copying element to index 1 of n3 array
        // 2 elements will be copied
        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() を使用しています。 メソッド、

ご覧のとおり、int の要素のデフォルトの初期値は 型配列は 0 です。


4. copyOfRange() メソッドを使用した配列のコピー

Java Arrays クラスで定義されている copyOfRange() メソッドを使用して、配列をコピーすることもできます。たとえば、

// To use toString() and copyOfRange() method
import java.util.Arrays;

class ArraysCopy {
    public static void main(String[] args) {
      
        int[] source = {2, 3, 12, 4, 12, -2};
      
        // copying entire source array to destination
        int[] destination1 = Arrays.copyOfRange(source, 0, source.length);      
        System.out.println("destination1 = " + Arrays.toString(destination1)); 
      
        // copying from index 2 to 5 (5 is not included) 
        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);

ここで、destination1 を作成していることがわかります 配列と source のコピー 同時に配列します。 destination1 を作成していません copyOfRange() を呼び出す前の配列 方法。メソッドの詳細については、Java copyOfRange を参照してください。


5.ループを使用した 2 次元配列のコピー

1 次元配列と同様に、for を使用して 2 次元配列をコピーすることもできます。 ループ。たとえば、

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) {

            // allocating space for each row of destination array
            destination[i] = new int[source[i].length];

            for (int j = 0; j < destination[i].length; ++j) {
                destination[i][j] = source[i][j];
            }
        }
     
        // displaying destination array
        System.out.println(Arrays.deepToString(destination));  
      
    }
}

出力 :

[[1, 2, 3, 4], [5, 6], [0, 2, 42, -4, 5]]

上記のプログラムで、次の行に注目してください。

System.out.println(Arrays.deepToString(destination);

ここでは、deepToString() メソッドを使用して、2 次元配列をより適切に表現します。詳細については、Java deepToString() にアクセスしてください。


arraycopy() を使用した 2 次元配列のコピー

上記のコードをより単純にするために、内側のループを System.arraycopy() に置き換えることができます 1 次元配列の場合と同様です。たとえば、

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) {

             // allocating space for each row of destination array
             destination[i] = new int[source[i].length];
             System.arraycopy(source[i], 0, destination[i], 0, destination[i].length);
        }
     
        // displaying destination array
        System.out.println(Arrays.deepToString(destination));      
    }
}

出力 :

[[1, 2, 3, 4], [5, 6], [0, 2, 42, -4, 5]]

ここで、内側の for を置き換えることで同じ出力が得られることがわかります arraycopy() でループ メソッド。


Java

  1. C# 配列
  2. Java オペレーター
  3. Java コメント
  4. Java インターフェイス
  5. Java try-with-resources
  6. Java アノテーション
  7. C++ の配列 |宣言する |初期化 |配列へのポインタの例
  8. 例による配列の C++ 動的割り当て
  9. Java Arrays チュートリアル:宣言、作成、初期化 [例]
  10. Java でオブジェクトの配列を作成する方法
  11. Java のバブル ソート アルゴリズム:配列ソート プログラムと例