Java
 Computer >> コンピューター >  >> プログラミング >> Java

Javaで配列の特定の範囲をコピーする方法!copyOf()とcopyOfRange()の使い方

Javaでは、java.utilパッケージに含まれるArraysクラスのメソッドを使うことで、配列の一部や全体を簡単にコピーできます。本記事では、代表的な2つの方法であるcopyOf()メソッドとcopyOfRange()メソッドについて、サンプルコードと実行結果つきでわかりやすく解説します。

copyOf()メソッドを使う方法

Arraysクラス(java.utilパッケージ)のcopyOf()メソッドは、以下の2つの引数を受け取ります。

  • コピー元となる任意の型の配列
  • 新しい配列の長さを表す整数値

このメソッドは、指定された配列の先頭から指定した長さ分の要素を新しい配列にコピーして返します。元の配列の長さよりも大きい値を指定した場合、足りない部分にはデフォルト値(オブジェクト型ならnull、数値型なら0など)が格納される点に注意してください。

サンプルコード

import java.util.Arrays;
public class CopyingSectionOfArray {
    public static void main(String[] args) {
        String str[] = new String[10];
        // 配列に値を格納
        str[0] = "Java";
        str[1] = "WebGL";
        str[2] = "OpenCV";
        str[3] = "OpenNLP";
        str[4] = "JOGL";
        str[5] = "Hadoop";
        str[6] = "HBase";
        str[7] = "Flume";
        str[8] = "Mahout";
        str[9] = "Impala";
        System.out.println("配列の内容:");
        System.out.println(Arrays.toString(str));
        // 先頭から5つの要素をコピー
        String[] newArray = Arrays.copyOf(str, 5);
        System.out.println("コピーされた配列の内容:");
        System.out.println(Arrays.toString(newArray));
    }
}

実行結果

配列の内容:
[Java, WebGL, OpenCV, OpenNLP, JOGL, Hadoop, HBase, Flume, Mahout, Impala]
コピーされた配列の内容:
[Java, WebGL, OpenCV, OpenNLP, JOGL]

この例では、10個の要素を持つ配列のうち、先頭から5つ目までの要素が新しい配列にコピーされていることが確認できます。

copyOfRange()メソッドを使う方法

配列の途中から任意の範囲をコピーしたい場合は、同じくArraysクラスのcopyOfRange()メソッドを使用します。このメソッドは以下の3つの引数を受け取ります。

  • コピー元となる任意の型の配列
  • コピー範囲の開始位置(インデックス)
  • コピー範囲の終了位置(インデックス)※終了位置の要素は含まれない

指定された範囲の要素を新しい配列にコピーして返します。たとえば(str, 2, 7)と指定した場合、インデックス2〜6の要素がコピーされます。

サンプルコード

import java.util.Arrays;
public class CopyingSectionOfArray {
    public static void main(String[] args) {
        String str[] = new String[10];
        // 配列に値を格納
        str[0] = "Java";
        str[1] = "WebGL";
        str[2] = "OpenCV";
        str[3] = "OpenNLP";
        str[4] = "JOGL";
        str[5] = "Hadoop";
        str[6] = "HBase";
        str[7] = "Flume";
        str[8] = "Mahout";
        str[9] = "Impala";
        System.out.println("配列の内容:");
        System.out.println(Arrays.toString(str));
        // インデックス2〜6(7は含まない)の要素をコピー
        String[] newArray = Arrays.copyOfRange(str, 2, 7);
        System.out.println("コピーされた配列の内容:");
        System.out.println(Arrays.toString(newArray));
    }
}

実行結果

配列の内容:
[Java, WebGL, OpenCV, OpenNLP, JOGL, Hadoop, HBase, Flume, Mahout, Impala]
コピーされた配列の内容:
[OpenCV, OpenNLP, JOGL, Hadoop, HBase]

インデックス2(OpenCV)からインデックス6(HBase)までの5つの要素が、正しくコピーできていますね。

補足:System.arraycopy()を使う方法

より柔軟な制御が必要なケースでは、System.arraycopy()メソッドも選択肢になります。このメソッドは「コピー元の開始位置」「コピー先の配列とその貼り付け開始位置」「コピーする要素数」を指定できるため、既存の別の配列の途中へ上書きコピーしたい場合などに便利です。

String[] dest = new String[5];
// srcのインデックス2から3要素を、destのインデックス0からコピー
System.arraycopy(str, 2, dest, 0, 3);

まとめ

  • 先頭からn個コピーしたいArrays.copyOf(配列, 長さ)
  • 任意の範囲をコピーしたいArrays.copyOfRange(配列, 開始, 終了)(終了インデックスは含まれない)
  • 別の配列へ部分的に上書きしたいSystem.arraycopy()

用途に応じてこれらのメソッドを使い分けることで、配列操作のコードをシンプルかつ安全に記述できます。

  1. JavaでXMLをJSON配列に変換する方法

    JSON(JavaScript Object Notation)は、軽量なデータ交換フォーマットであり、キーと値のペア形式でデータを表現します。Javaでは、org.json.XMLクラスを使用することで、XMLをJSON配列へ簡単に変換できます。このクラスが提供する静的メソッドXML.toJSONObject()を使えば、XML文字列をJSONObjectに変換することが可能です。構文public static JSONObject toJSONObject(java.lang.String string) throws JSONExceptionこのメソッドはXML形式の文字列を引数として

  2. JavaでJSON配列(JSONArray)をCSV形式に変換する方法を徹底解説

    JSONは軽量かつ言語に依存しないデータ交換フォーマットとして広く利用されています。JavaではJSONArrayクラスを使うことで、文字列として渡されたJSONテキストを解析し、java.util.Listインターフェースをサポートしたベクトル(リスト)状のオブジェクトとして扱えます。 JSON配列をCSV形式に変換するには、org.json.CDLクラスが便利です。このクラスが提供する静的メソッドtoString()を使用すると、JSONArrayをカンマ区切りのテキストに簡単に変換できます。また、変換したデータをCSVファイルとして保存する場合は、org.apache.commons.i