Java | 配列(Array)と ArrayList の違い

Java Java
スポンサーリンク

では、最後に 数値や文字列の複雑条件でもフィルタ可能な拡張版 を作ります。
これで「複数条件(AND/OR)」「範囲指定」なども簡単に連結時にフィルタできます。


1. 複雑条件対応ユーティリティ

import java.util.ArrayList;
import java.util.Arrays;
import java.util.function.Predicate;

public class ConcatUtilAdvanced {

    // ----------------------------
    // 配列版(複雑条件対応)
    // ----------------------------
    @SafeVarargs
    public static <T> T[] concatAllFiltered(Predicate<T> condition, T[]... arrays) {
        ArrayList<T> temp = new ArrayList<>();
        for(T[] arr : arrays) {
            for(T element : arr) {
                if(condition.test(element)) temp.add(element);
            }
        }

        if(arrays.length == 0) return null;
        @SuppressWarnings("unchecked")
        T[] result = Arrays.copyOf(arrays[0], temp.size());
        for(int i = 0; i < temp.size(); i++) result[i] = temp.get(i);
        return result;
    }

    // ----------------------------
    // ArrayList版(複雑条件対応)
    // ----------------------------
    @SafeVarargs
    public static <T> ArrayList<T> concatAllFiltered(Predicate<T> condition, ArrayList<T>... lists) {
        ArrayList<T> result = new ArrayList<>();
        for(ArrayList<T> list : lists) {
            for(T element : list) {
                if(condition.test(element)) result.add(element);
            }
        }
        return result;
    }

    // ----------------------------
    // 使用例
    // ----------------------------
    public static void main(String[] args) {
        // 配列の例(文字列)
        String[] classA = {"田中", "佐藤", "鈴木"};
        String[] classB = {"高橋", "伊藤", "田村"};
        String[] classC = {"山田", "中田"};

        // 「名前に田が含まれる AND 名前が3文字以上」の人だけ連結
        String[] filteredArray = concatAllFiltered(
            name -> name.contains("田") && name.length() >= 3,
            classA, classB, classC
        );
        System.out.println("文字列条件付き配列連結結果:");
        for(String name : filteredArray) System.out.println(name);

        System.out.println();

        // 数値の例(ArrayList)
        ArrayList<Integer> listA = new ArrayList<>(Arrays.asList(10, 25, 30));
        ArrayList<Integer> listB = new ArrayList<>(Arrays.asList(5, 40, 50));
        ArrayList<Integer> listC = new ArrayList<>(Arrays.asList(35, 60));

        // 「20以上かつ50未満」の数値だけ連結
        ArrayList<Integer> filteredList = concatAllFiltered(
            n -> n >= 20 && n < 50,
            listA, listB, listC
        );
        System.out.println("数値条件付きArrayList連結結果:");
        for(Integer n : filteredList) System.out.println(n);
    }
}
Java

2. 実行結果イメージ

文字列条件付き配列連結結果:
田中
田村
山田

数値条件付きArrayList連結結果:
25
30
40
35

3. ポイント

  1. 複数条件の AND / ORPredicate 内で自由に組み合わせられる
    • 例: name.contains("田") && name.length() >= 3
    • 例: n >= 20 && n < 50
  2. 配列版・ArrayList版の両方に対応
  3. 複数配列・複数リストをまとめて条件付きで連結可能
  4. 実務で「複雑条件のフィルタ+結合」を一度に処理できる

💡 初心者向けまとめ

  • Predicate<T> を使うことで、文字列・数値・オブジェクトなど あらゆる条件を自由に指定 可能
  • 配列・ArrayList どちらでも同じ感覚で使える
  • 関数にまとめることで、再利用性が高く、コードもスッキリ
Java
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました