[Java] ArrayListを拡張for文でループする方法

JavaでArrayListを拡張for文でループするには、for-each構文を使用します。

ArrayListIterableインターフェースを実装しているため、拡張for文で簡単に要素を順番に処理できます。

構文はfor (要素の型変数名 : ArrayList)です。

例えば、ArrayList<String>をループする場合、for (String item : arrayList)のように記述します。

これにより、ArrayList内の各要素に対して処理を行うことができます。

この記事でわかること
  • 拡張for文の基本的な使い方
  • ArrayListの要素を条件付きで処理
  • ネストされたArrayListのループ方法
  • 要素のフィルタリングと変換
  • Iteratorを使った要素の削除方法

目次から探す

拡張for文とは

拡張for文(for-each文)は、Javaにおいてコレクションや配列の要素を簡潔にループ処理するための構文です。

従来のfor文と比べて、コードがシンプルになり、可読性が向上します。

特に、ArrayListや配列のようなデータ構造を扱う際に便利です。

拡張for文を使用することで、要素のインデックスを意識せずに、直接要素にアクセスできるため、エラーのリスクも低減します。

基本的な構文は「for (型変数名 : コレクション)」となっており、コレクション内の各要素に対して処理を行うことができます。

これにより、開発者はより効率的にプログラムを記述できるようになります。

ArrayListを拡張for文でループする方法

基本的な構文

ArrayListを拡張for文でループする基本的な構文は以下の通りです。

for (型 変数名 : ArrayList名) {
    // 処理内容
}

この構文を使用することで、ArrayList内の各要素に対して簡単にアクセスし、処理を行うことができます。

型にはArrayListに格納されている要素の型を指定します。

ArrayListの要素を順番に処理する

ArrayListの要素を順番に処理するためのサンプルコードを以下に示します。

import java.util.ArrayList;
public class App {
    public static void main(String[] args) {
        ArrayList<String> fruits = new ArrayList<>();
        fruits.add("リンゴ");
        fruits.add("バナナ");
        fruits.add("オレンジ");
        for (String fruit : fruits) {
            // 各果物を処理する
            System.out.println(fruit);
        }
    }
}

このコードを実行すると、ArrayListに格納された果物の名前が順番に出力されます。

リンゴ
バナナ
オレンジ

ArrayListの要素を出力する例

ArrayListの要素を出力する具体的な例を示します。

以下のコードでは、整数のArrayListを作成し、その要素を出力します。

import java.util.ArrayList;
public class App {
    public static void main(String[] args) {
        ArrayList<Integer> numbers = new ArrayList<>();
        numbers.add(1);
        numbers.add(2);
        numbers.add(3);
        for (Integer number : numbers) {
            // 各数字を出力する
            System.out.println(number);
        }
    }
}

このコードを実行すると、整数のリストが出力されます。

1
2
3

ArrayListの要素を操作する例

ArrayListの要素を操作する例として、要素を2倍にして出力するコードを示します。

import java.util.ArrayList;
public class App {
    public static void main(String[] args) {
        ArrayList<Integer> numbers = new ArrayList<>();
        numbers.add(1);
        numbers.add(2);
        numbers.add(3);
        for (Integer number : numbers) {
            // 各数字を2倍にして出力する
            System.out.println(number * 2);
        }
    }
}

このコードを実行すると、各要素が2倍になった結果が出力されます。

2
4
6

null要素が含まれる場合の注意点

ArrayListにnull要素が含まれる場合、拡張for文を使用しても特にエラーは発生しませんが、null要素に対して操作を行うとNullPointerExceptionが発生する可能性があります。

以下のコードは、null要素を含むArrayListを処理する例です。

import java.util.ArrayList;
public class App {
    public static void main(String[] args) {
        ArrayList<String> items = new ArrayList<>();
        items.add("アイテム1");
        items.add(null); // null要素
        items.add("アイテム3");
        for (String item : items) {
            // nullチェックを行う
            if (item != null) {
                System.out.println(item);
            } else {
                System.out.println("null要素が含まれています。");
            }
        }
    }
}

このコードを実行すると、null要素が含まれていることが出力されます。

アイテム1
null要素が含まれています。
アイテム3

このように、null要素が含まれる場合は、事前にnullチェックを行うことが重要です。

ArrayListの型パラメータと拡張for文

ジェネリクスを使ったArrayListのループ

JavaのArrayListは、ジェネリクスを使用して型安全なコレクションを提供します。

これにより、特定の型の要素のみを格納でき、コンパイル時に型チェックが行われます。

以下のコードは、ジェネリクスを使ったArrayListのループの例です。

import java.util.ArrayList;
public class App {
    public static void main(String[] args) {
        ArrayList<Double> prices = new ArrayList<>();
        prices.add(1000.50);
        prices.add(2000.75);
        prices.add(1500.00);
        for (Double price : prices) {
            // 各価格を出力する
            System.out.println(price);
        }
    }
}

このコードを実行すると、Double型の要素が出力されます。

1000.5
2000.75
1500.0

型パラメータが異なるArrayListのループ

異なる型のArrayListをループする場合、型パラメータを指定しないとコンパイルエラーが発生します。

以下の例では、String型Integer型のArrayListをそれぞれループ処理します。

import java.util.ArrayList;
public class App {
    public static void main(String[] args) {
        ArrayList<String> names = new ArrayList<>();
        names.add("田中");
        names.add("鈴木");
        ArrayList<Integer> ages = new ArrayList<>();
        ages.add(25);
        ages.add(30);
        for (String name : names) {
            // 各名前を出力する
            System.out.println(name);
        }
        for (Integer age : ages) {
            // 各年齢を出力する
            System.out.println(age);
        }
    }
}

このコードを実行すると、名前と年齢がそれぞれ出力されます。

田中
鈴木
25
30

プリミティブ型のArrayListをループする方法

Javaでは、ArrayListはオブジェクトを格納するため、プリミティブ型(intやcharなど)を直接格納することはできません。

しかし、ラッパークラスを使用することで、プリミティブ型の値をArrayListに格納できます。

以下のコードは、Integer型のArrayListを使用してint型の値をループする例です。

import java.util.ArrayList;
public class App {
    public static void main(String[] args) {
        ArrayList<Integer> numbers = new ArrayList<>();
        numbers.add(1); // int型をInteger型に自動変換
        numbers.add(2);
        numbers.add(3);
        for (Integer number : numbers) {
            // 各数字を出力する
            System.out.println(number);
        }
    }
}

このコードを実行すると、整数のリストが出力されます。

1
2
3

このように、プリミティブ型の値をArrayListに格納する場合は、対応するラッパークラスを使用する必要があります。

ArrayListのネストと拡張for文

二次元ArrayListを拡張for文でループする

二次元ArrayListは、ArrayListの中にArrayListを格納する構造です。

これを拡張for文でループすることで、各要素にアクセスできます。

以下のコードは、二次元ArrayListをループする例です。

import java.util.ArrayList;
public class App {
    public static void main(String[] args) {
        ArrayList<ArrayList<String>> nestedList = new ArrayList<>();
        ArrayList<String> innerList1 = new ArrayList<>();
        innerList1.add("リンゴ");
        innerList1.add("バナナ");
        ArrayList<String> innerList2 = new ArrayList<>();
        innerList2.add("オレンジ");
        innerList2.add("グレープ");
        nestedList.add(innerList1);
        nestedList.add(innerList2);
        for (ArrayList<String> innerList : nestedList) {
            for (String fruit : innerList) {
                // 各果物を出力する
                System.out.println(fruit);
            }
        }
    }
}

このコードを実行すると、二次元ArrayListに格納された果物の名前が出力されます。

リンゴ
バナナ
オレンジ
グレープ

三次元ArrayListを拡張for文でループする

三次元ArrayListは、ArrayListの中に二次元ArrayListを格納する構造です。

以下のコードは、三次元ArrayListをループする例です。

import java.util.ArrayList;
public class App {
    public static void main(String[] args) {
        ArrayList<ArrayList<ArrayList<String>>> threeDimensionalList = new ArrayList<>();
        ArrayList<ArrayList<String>> twoDimensionalList1 = new ArrayList<>();
        ArrayList<String> innerList1 = new ArrayList<>();
        innerList1.add("リンゴ");
        innerList1.add("バナナ");
        twoDimensionalList1.add(innerList1);
        ArrayList<String> innerList2 = new ArrayList<>();
        innerList2.add("オレンジ");
        innerList2.add("グレープ");
        twoDimensionalList1.add(innerList2);
        threeDimensionalList.add(twoDimensionalList1);
        for (ArrayList<ArrayList<String>> twoDimensionalList : threeDimensionalList) {
            for (ArrayList<String> innerList : twoDimensionalList) {
                for (String fruit : innerList) {
                    // 各果物を出力する
                    System.out.println(fruit);
                }
            }
        }
    }
}

このコードを実行すると、三次元ArrayListに格納された果物の名前が出力されます。

リンゴ
バナナ
オレンジ
グレープ

ネストされたArrayListの要素を操作する

ネストされたArrayListの要素を操作する場合、各レベルでループを使用して要素にアクセスし、必要な処理を行います。

以下のコードは、ネストされたArrayListの要素を操作する例です。

ここでは、各果物の名前に「 – 新鮮」を追加して出力します。

import java.util.ArrayList;
public class App {
    public static void main(String[] args) {
        ArrayList<ArrayList<String>> nestedList = new ArrayList<>();
        ArrayList<String> innerList1 = new ArrayList<>();
        innerList1.add("リンゴ");
        innerList1.add("バナナ");
        ArrayList<String> innerList2 = new ArrayList<>();
        innerList2.add("オレンジ");
        innerList2.add("グレープ");
        nestedList.add(innerList1);
        nestedList.add(innerList2);
        for (ArrayList<String> innerList : nestedList) {
            for (String fruit : innerList) {
                // 各果物の名前に「 - 新鮮」を追加して出力する
                System.out.println(fruit + " - 新鮮");
            }
        }
    }
}

このコードを実行すると、各果物の名前に「 – 新鮮」が追加された結果が出力されます。

リンゴ - 新鮮
バナナ - 新鮮
オレンジ - 新鮮
グレープ - 新鮮

このように、ネストされたArrayListの要素に対しても、拡張for文を使用して簡単に操作を行うことができます。

応用例

ArrayListの要素を条件付きで処理する

ArrayListの要素を条件付きで処理する場合、if文を使用して特定の条件を満たす要素に対してのみ処理を行うことができます。

以下のコードは、特定の条件(例えば、文字列の長さが3以上)を満たす要素を出力する例です。

import java.util.ArrayList;
public class App {
    public static void main(String[] args) {
        ArrayList<String> words = new ArrayList<>();
        words.add("apple");
        words.add("is");
        words.add("banana");
        words.add("kiwi");
        for (String word : words) {
            // 文字列の長さが3以上の場合に出力する
            if (word.length() >= 3) {
                System.out.println(word);
            }
        }
    }
}

このコードを実行すると、条件を満たす単語が出力されます。

apple
banana
kiwi

ArrayListの要素をフィルタリングする

ArrayListの要素をフィルタリングするためには、条件に基づいて新しいリストを作成することができます。

以下のコードは、偶数の整数のみをフィルタリングして新しいリストに格納する例です。

import java.util.ArrayList;
public class App {
    public static void main(String[] args) {
        ArrayList<Integer> numbers = new ArrayList<>();
        numbers.add(1);
        numbers.add(2);
        numbers.add(3);
        numbers.add(4);
        numbers.add(5);
        ArrayList<Integer> evenNumbers = new ArrayList<>();
        for (Integer number : numbers) {
            // 偶数の場合に新しいリストに追加する
            if (number % 2 == 0) {
                evenNumbers.add(number);
            }
        }
        for (Integer evenNumber : evenNumbers) {
            // 偶数を出力する
            System.out.println(evenNumber);
        }
    }
}

このコードを実行すると、偶数の整数が出力されます。

2
4

ArrayListの要素を変換して新しいリストを作成する

ArrayListの要素を変換して新しいリストを作成する場合、各要素に対して変換処理を行い、新しいリストに追加します。

以下のコードは、文字列の要素を大文字に変換して新しいリストを作成する例です。

import java.util.ArrayList;
public class App {
    public static void main(String[] args) {
        ArrayList<String> fruits = new ArrayList<>();
        fruits.add("apple");
        fruits.add("banana");
        fruits.add("orange");
        ArrayList<String> upperCaseFruits = new ArrayList<>();
        for (String fruit : fruits) {
            // 各果物の名前を大文字に変換して新しいリストに追加する
            upperCaseFruits.add(fruit.toUpperCase());
        }
        for (String upperCaseFruit : upperCaseFruits) {
            // 大文字の果物名を出力する
            System.out.println(upperCaseFruit);
        }
    }
}

このコードを実行すると、大文字に変換された果物の名前が出力されます。

APPLE
BANANA
ORANGE

ArrayListの要素を逆順にループする

ArrayListの要素を逆順にループするには、通常のfor文を使用してインデックスを逆に指定します。

以下のコードは、ArrayListの要素を逆順に出力する例です。

import java.util.ArrayList;
public class App {
    public static void main(String[] args) {
        ArrayList<String> fruits = new ArrayList<>();
        fruits.add("リンゴ");
        fruits.add("バナナ");
        fruits.add("オレンジ");
        for (int i = fruits.size() - 1; i >= 0; i--) {
            // 逆順に果物を出力する
            System.out.println(fruits.get(i));
        }
    }
}

このコードを実行すると、果物の名前が逆順に出力されます。

オレンジ
バナナ
リンゴ

ArrayListの要素を削除しながらループする

ArrayListの要素を削除しながらループする場合、Iteratorを使用することが推奨されます。

以下のコードは、特定の条件(例えば、文字列が「バナナ」の場合)を満たす要素を削除する例です。

import java.util.ArrayList;
import java.util.Iterator;
public class App {
    public static void main(String[] args) {
        ArrayList<String> fruits = new ArrayList<>();
        fruits.add("リンゴ");
        fruits.add("バナナ");
        fruits.add("オレンジ");
        Iterator<String> iterator = fruits.iterator();
        while (iterator.hasNext()) {
            String fruit = iterator.next();
            // 「バナナ」の場合に削除する
            if (fruit.equals("バナナ")) {
                iterator.remove();
            }
        }
        for (String fruit : fruits) {
            // 残った果物を出力する
            System.out.println(fruit);
        }
    }
}

このコードを実行すると、「バナナ」が削除された果物の名前が出力されます。

リンゴ
オレンジ

このように、ArrayListの要素を削除しながらループする場合は、Iteratorを使用することで安全に操作を行うことができます。

よくある質問

拡張for文でArrayListの要素を削除できる?

拡張for文を使用してArrayListの要素を削除することはできません。

拡張for文は、コレクションの要素を順番に処理するための構文であり、要素の削除や変更を行うことはできません。

要素を削除する場合は、Iteratorを使用することが推奨されます。

Iteratorを使うことで、要素を安全に削除しながらループ処理を行うことができます。

拡張for文でArrayListのインデックスを取得する方法は?

拡張for文では、直接インデックスを取得することはできません。

拡張for文は要素に対して直接アクセスするため、インデックス情報は提供されません。

インデックスが必要な場合は、通常のfor文を使用するか、別の変数を用意してカウントする方法があります。

例えば、以下のように通常のfor文を使用することができます。

for (int i = 0; i < arrayList.size(); i++) {
    // arrayList.get(i)で要素にアクセス
}

拡張for文とIteratorの違いは?

拡張for文とIteratorの主な違いは、使用目的と機能にあります。

拡張for文は、コレクションの要素を簡潔にループ処理するための構文であり、可読性が高いのが特徴です。

一方、Iteratorは、コレクションの要素を順番に処理するためのオブジェクトであり、要素の削除や変更が可能です。

具体的な違いは以下の通りです。

  • 拡張for文:
    • 簡潔で可読性が高い
    • 要素の削除や変更はできない
    • インデックス情報は取得できない
  • Iterator:
    • より柔軟な操作が可能
    • 要素の削除や変更ができる
    • インデックス情報は提供されないが、要素を順番に処理できる

このため、要素の削除や変更が必要な場合はIteratorを使用し、単に要素を処理するだけの場合は拡張for文を使用するのが一般的です。

まとめ

この記事では、JavaのArrayListを拡張for文でループする方法について詳しく解説しました。

基本的な構文から始まり、ArrayListの要素を条件付きで処理したり、フィルタリングしたり、逆順にループする方法など、さまざまな応用例を紹介しました。

これらの知識を活用して、より効率的にArrayListを操作し、プログラムの可読性を向上させることができるでしょう。

ぜひ、実際のプロジェクトや学習において、これらのテクニックを試してみてください。

当サイトはリンクフリーです。出典元を明記していただければ、ご自由に引用していただいて構いません。

関連カテゴリーから探す

  • 繰り返し処理 (7)
  • 条件分岐 (1)
  • URLをコピーしました!
目次から探す