では、配列と ArrayList の両方に対応した 連結関数を作る応用例 を紹介します。
これにより「同じ関数でどちらの型も連結できる」ようになります。
例題
「クラスAとクラスBの出席リストをまとめる関数を作る」
1. 配列版の連結関数
public class ConcatUtil {
// String配列を連結する関数
public static String[] concatArrays(String[] arr1, String[] arr2) {
String[] result = new String[arr1.length + arr2.length];
for(int i = 0; i < arr1.length; i++) {
result[i] = arr1[i];
}
for(int i = 0; i < arr2.length; i++) {
result[arr1.length + i] = arr2[i];
}
return result;
}
public static void main(String[] args) {
String[] classA = {"田中", "佐藤", "鈴木"};
String[] classB = {"高橋", "伊藤"};
String[] allClasses = concatArrays(classA, classB);
for(String name : allClasses) {
System.out.println(name);
}
}
}
Javaポイント
- 配列は新しい配列を作ってコピーする必要がある
- 連結操作を関数にまとめると使いやすくなる
2. ArrayList版の連結関数
import java.util.ArrayList;
public class ConcatUtilList {
// ArrayListを連結する関数
public static <T> ArrayList<T> concatLists(ArrayList<T> list1, ArrayList<T> list2) {
ArrayList<T> result = new ArrayList<>();
result.addAll(list1);
result.addAll(list2);
return result;
}
public static void main(String[] args) {
ArrayList<String> classA = new ArrayList<>();
classA.add("田中");
classA.add("佐藤");
classA.add("鈴木");
ArrayList<String> classB = new ArrayList<>();
classB.add("高橋");
classB.add("伊藤");
ArrayList<String> allClasses = concatLists(classA, classB);
for(String name : allClasses) {
System.out.println(name);
}
}
}
Javaポイント
- ArrayList なら
.addAll()で簡単に連結できる - ジェネリクス
<T>を使うと どんな型でも使える関数 にできる
3. 配列と ArrayList 両対応の比較図
操作 配列 (Array) ArrayList
---------------- -------------------------------- ---------------
作成 String[] arr = new String[3]; ArrayList<String> list = new ArrayList<>();
連結関数 concatArrays(arr1, arr2); concatLists(list1, list2);
コード量 多い(コピー処理必要) 少ない(addAllでOK)
サイズ変更 不可(新配列を作る) 可(自動拡張)
汎用性 型ごとに関数必要 ジェネリクスで汎用可能
💡 初心者向けまとめ
- 配列は固定長なので、連結のたびに新しい配列を作る必要がある
- ArrayList は addAll で直感的に連結できる
- 関数にまとめると再利用が簡単
- ArrayList はジェネリクスを使うと、型に依存せずどんなリストでも使える
