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

Javaでコレクションの要素を取得する3つの方法(拡張for・Iterator・Enumeration)

Javaでは、コレクションオブジェクトに格納された要素を取得する方法が主に3つあります。それぞれの特徴と使い方を、サンプルコードと実行結果とともに解説します。

1. 拡張forループ(for-eachループ)を使う方法

拡張forループ(for-eachループ)を使うと、コレクションの全要素を先頭から順番にシンプルに走査できます。インデックス管理や終了条件の記述が不要なため、最も可読性が高い方法です。

サンプルコード

import java.util.ArrayList;

public class RetrievingData {
    public static void main(String[] args) {
        // ArrayListオブジェクトの生成
        ArrayList<String> list = new ArrayList<String>();
        list.add("JavaFX");
        list.add("Java");
        list.add("WebGL");
        list.add("OpenCV");
        list.add("OpenNLP");
        list.add("JOGL");
        list.add("Hadoop");
        list.add("HBase");
        list.add("Flume");
        list.add("Mahout");
        list.add("Impala");

        System.out.println("ArrayListの内容:");
        for (String e : list) {
            System.out.println(e);
        }
    }
}

実行結果

ArrayListの内容:
JavaFX
Java
WebGL
OpenCV
OpenNLP
JOGL
Hadoop
HBase
Flume
Mahout
Impala

2. Iterator / ListIterator を使う方法

Javaには、コレクションの要素を順次取り出すための Iterator および ListIterator インターフェースが用意されています。

  • hasNext():次の要素が存在する場合は true、存在しない場合は false を返します。
  • next():コレクションの次の要素を返します。
  • previous()(ListIteratorのみ):前の要素を返します。
  • hasPrevious()(ListIteratorのみ):前の要素が存在するかどうかを判定します。

これらのメソッドを組み合わせることで、前方方向だけでなく後方方向への走査も可能です。Iteratorオブジェクトは iterator() メソッド、ListIteratorオブジェクトは listIterator() メソッドで取得できます。

サンプルコード

import java.util.ArrayList;
import java.util.Iterator;
import java.util.ListIterator;

public class RetrievingData {
    public static void main(String[] args) {
        // ArrayListオブジェクトの生成
        ArrayList<String> list = new ArrayList<String>();
        list.add("JavaFX");
        list.add("Java");
        list.add("WebGL");
        list.add("OpenCV");
        list.add("OpenNLP");
        list.add("JOGL");
        list.add("Hadoop");
        list.add("HBase");
        list.add("Flume");
        list.add("Mahout");
        list.add("Impala");

        // 前から後ろへ走査(Iterator)
        System.out.println("ArrayListの内容(先頭から末尾へ):");
        Iterator<String> it = list.iterator();
        while (it.hasNext()) {
            System.out.println(it.next());
        }

        // 後ろから前へ走査(ListIterator)
        System.out.println("ArrayListの内容(末尾から先頭へ):");
        ListIterator<String> lit = list.listIterator();
        while (lit.hasNext()) {
            lit.next();
        }
        while (lit.hasPrevious()) {
            System.out.println(lit.previous());
        }
    }
}

実行結果

ArrayListの内容(先頭から末尾へ):
JavaFX
Java
WebGL
OpenCV
OpenNLP
JOGL
Hadoop
HBase
Flume
Mahout
Impala
ArrayListの内容(末尾から先頭へ):
Impala
Mahout
Flume
HBase
Hadoop
JOGL
OpenNLP
OpenCV
WebGL
Java
JavaFX

3. Enumeration を使う方法

Enumeration は、レガシーなコレクションである Vector や Hashtable などで利用される要素取得インターフェースです。

  • hasMoreElements():現在位置より後に要素が残っている場合は true、なければ false を返します。
  • nextElement():列挙内の次の要素を返します。

この2つのメソッドを組み合わせることで、コレクションの内容をすべて取り出せます。Vectorの場合は elements() メソッドで Enumeration オブジェクトを取得します。

サンプルコード

import java.util.Enumeration;
import java.util.Vector;

public class EnumerationExample {
    public static void main(String args[]) {
        // Vectorの生成と要素の追加
        Vector<Integer> vec = new Vector<Integer>();
        vec.add(1254);
        vec.add(4587);
        vec.add(5211);
        vec.add(4205);
        vec.add(1124);
        vec.add(8115);

        // Enumerationを使って要素を取得
        Enumeration<Integer> en = vec.elements();
        while (en.hasMoreElements()) {
            System.out.println(en.nextElement());
        }
    }
}

実行結果

1254
4587
5211
4205
1124
8115

まとめ

方法特徴
拡張forループ最も簡潔。単純な全件走査に最適
Iterator / ListIterator双方向の走査や要素の安全な削除が可能
EnumerationVectorなどレガシークラス向け。新規コードでは非推奨

通常のコーディングでは拡張forループが第一候補となり、走査中に要素を削除したい場合や双方向アクセスが必要な場合には Iterator / ListIterator を選ぶのが一般的です。Enumeration は古いAPIとの互換性が必要な場面でのみ使用するとよいでしょう。

  1. JavaのSwingUtilities.invokeLater()メソッドの使い方を徹底解説

    invokeLater()メソッドとはinvokeLater()メソッドは、SwingUtilitiesクラスが提供するstaticメソッドの一つで、AWTイベントディスパッチスレッド(Event Dispatch Thread)上でタスクを非同期に実行するために使用されます。このメソッドはSwingUtilities.invokeAndWait()とよく似た動作をしますが、大きな違いは、処理のリクエストをイベントキューに登録した後、すぐに呼び出し元へ制御を返すという点です。つまり、invokeLater()は引数で渡されたRunnableオブジェクト内のコードブロックの実行完了を待ちません。

  2. JavaでJComboBoxの項目をソートする方法!DefaultComboBoxModelのカスタマイズ例

    JComboBoxはJComponentクラスのサブクラスであり、テキストフィールドと、ユーザーが値を選択できるドロップダウンリストを組み合わせたSwingコンポーネントです。ユーザーがコンボボックスを操作すると、ActionListener、ChangeListener、ItemListenerといったインターフェースを通じてイベントを受け取ることができます。 ただし、標準のJComboBoxにはアイテムを並べ替える(ソートする)機能は用意されていません。そこで本記事では、DefaultComboBoxModelクラスを継承した独自のモデルクラスを作成し、コンボボックスの項目を常に整序された