Java で配列に新しい要素を追加する方法
このチュートリアルでは、Java で配列に新しい要素を追加する方法について説明します。
Java の Array
は、同じデータ型の要素を一定数保持するコンテナオブジェクトです。配列の長さは配列オブジェクトの宣言時に定義され、後から変更することはできません。
例えば、Java で長さ 5 の配列をいくつかの値でインスタンス化したとします。
String[] arr = new String[5];
arr[0] = "1";
arr[1] = "2";
arr[2] = "3";
arr[3] = "4";
arr[4] = "5";
ここで、配列に 6 番目の要素を追加する必要があります。この 6 番目の要素を配列に追加してみましょう。
arr[5] = "6";
上記のコードの行では、次のようなエラーが発生します。
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 5 out of bounds for length 5
これは、最初に配列のサイズを 5 と宣言した後、6 番目の要素を追加しようとしたためです。
心配する必要はありません。配列の代わりに ArrayList
を使用するか、新しい要素を収容するために新しいより大きな配列を作成します。
配列の代わりに ArrayList
を使用する
より良い推奨される解決策は、配列の代わりに ArrayList
を使用することです。ArrayList
のサイズは固定ではないので、新しい要素を追加する必要があるときは、testList.add(element)
を実行することで簡単に追加することができます。
import java.util.*;
public class Main {
public static void main(String args[]) {
List<String> testList = new ArrayList<String>();
testList.add("1");
testList.add("2");
testList.add("3");
testList.add("4");
testList.add("5");
// Print the original list
System.out.println("Initial ArrayList:\n" + testList);
// Add elements without running into any error
testList.add("6");
testList.add("7");
// Print the list after adding elements
System.out.println("Modified ArrayList:\n" + testList);
}
}
上記のコードは以下のように出力します。
Initial ArrayList : [ 1, 2, 3, 4, 5 ] Modified ArrayList : [ 1, 2, 3, 4, 5, 6, 7 ]
また、既に配列を持っている場合は ArrayList
を直接作成することもできます。
import java.util.*;
public class Main {
public static void main(String args[]) {
// Create an array
String[] arr = new String[1];
arr[0] = "1";
// Convert to ArrayList
List<String> testList = new ArrayList<>(Arrays.asList(arr));
// Print the original list
System.out.println("Initial ArrayList:\n" + testList);
// Add elements to it
testList.add("2");
testList.add("3");
// Print the list after adding elements
System.out.println("Modified ArrayList:\n" + testList);
}
}
上のコードは以下のように出力します。
Initial ArrayList : [ 1 ] Modified ArrayList : [ 1, 2, 3 ]
これで、ArrayList
を簡単に配列に戻すことができます。
import java.util.*;
public class Main {
public static void main(String args[]) {
// Create an array
String[] arr = new String[1];
arr[0] = "1";
// Convert to ArrayList
List<String> testList = new ArrayList<>(Arrays.asList(arr));
// Add elements to it
testList.add("2");
testList.add("3");
// Convert the arraylist back to an array
arr = new String[testList.size()];
testList.toArray(arr);
}
}
より大きな新しい配列を作成する
もし配列だけを扱いたいのであれば、java.util.Arrays.copyOf
メソッドを使って、より大きな配列を作成して新しい要素を追加することができます。上で作成した配列 arr
を使って、下の例で新しい要素を追加してみましょう。
import java.util.*;
public class Main {
public static void main(String args[]) {
// Create an array
String[] arr = new String[5];
arr[0] = "1";
arr[1] = "2";
arr[2] = "3";
arr[3] = "4";
arr[4] = "5";
// print the original array
System.out.println("Initial Array:\n" + Arrays.toString(arr));
// Steps to add a new element
// Get the current length of the array
int N = arr.length;
// Create a new array of length N+1 and copy all the previous elements to this new array
arr = Arrays.copyOf(arr, N + 1);
// Add a new element to the array
arr[N] = "6";
// print the updated array
System.out.println("Modified Array:\n" + Arrays.toString(arr));
}
}
上記のコードは以下のように出力されます。
Initial Array : [ 1, 2, 3, 4, 5 ] Modified Array : [ 1, 2, 3, 4, 5, 6 ]
後になって arr
に別の要素を追加する必要が出てきた場合は、上記のコードブロックをもう一度繰り返さなければなりません。
なぜなら、新しい要素を追加するたびに O(n)
の複雑な時間がかかるからです。一方、ArrayList
を用いた新しい要素の追加は、O(1)
の償却コストを持ちます。