Collection の基本的な使い方

まずは、整数要素を java.util.ArrayList に入れてみましょう。 ソート機能付き java.util.TreeSet でも試しましょう。

なにをしているかというと、ArrayList (配列を用いたリスト)や TreeSet (順序付きSet) に、整数値をいくつか入れてから、その要素を順番に表示しているだけです。

プログラム例

UseSampleI

public class UseSampleI {

    public static void main(String[] args){
        /* まずは、ArrayList で実験 */
        ArrayList<Integer> ilist = new ArrayList<>();
        addIntegerSamples(ilist); /* 要素をつめて */
        System.out.print("print ilist:");  
        for(Integer i: ilist) {   /* 要素を順番に表示 */
            System.out.print(" " + i);
        }
        System.out.println();
        /* ArrayList の toString() を試してみましょう */
        System.out.println("ArrayList.toString() for ilist: " + ilist);
        
        /* 次は、TreeSet で実験 */
        TreeSet<Integer> iset = new TreeSet<>();
        addIntegerSamples(iset); /* 要素をつめて */
        System.out.print("print iset:");
        for(Integer i: iset) {   /* 要素を順番に表示 */
            System.out.print(" " + i);
        }
        System.out.println();
        /* TreeSet の toString() を試してみましょう */
        System.out.println("TreeSet.toString() for iset: " + iset);
    }

    
    /**
     * Integer 要素を Collection<Integer> に詰めるメソッド。
     * ArrayList<Integer> や TreeSet<Integer> も Collection<Integer> の
     * 一種だから、それらに使ってもらってもOK。
     * @param icol
     */
    public static void addIntegerSamples(Collection<Integer> icol) {
        icol.add(new Integer(3));
        icol.add(new Integer(15));
        icol.add(new Integer(7));
        icol.add(8); 
        // Object が来るところに、int がかかれていると、
        // 勝手に new Integer(8) をしてくれます。
        icol.add(9); 
        icol.add(7); 
    }
}

実行例

print ilist: 3 15 7 8 9 7
ArrayList.toString() for ilist: [3, 15, 7, 8, 9, 7]
print iset: 3 7 8 9 15
TreeSet.toString() for iset: [3, 7, 8, 9, 15]

プログラム解説

直接的に利用しているクラス/インタフェイス群

  • java.util.ArrayList<Integer>: Integer を要素にもつ ArrayList
    • クラス java.util.ArrayList: 配列をつかって実現された java.util.List の一種。
    • インタフェイス java.util.List: X番目の要素(list.get(X))などへのアクセスか可能。
    • インタフェイス java.util.Collection: add, contains, iterator, size などの基本的なメソッドのみ提供するためのもの。
  • java.util.TreeSet<Integer>: Integer を要素に持つ java.util.TreeSet
  • java.lang.Integer: int を Object 表現したもの。値はオブジェクト生成時に決まり、値変更は不可。別の Integer をつくって、差し替えましょう。

Enhanced Loop

for(Integer i: ilist) { ... } ってなに?

  • Collection ilist の各要素を Integer i として、 ... を実行という意味です。つまり、以下と等価。java.lang.Iterable を実装しているクラスなら、利用可能
for(Iterator<Integer> iter = ilist.iterator(); iter.hasNext(); ) {   /* 要素を順番に表示 */
    Integer i = iter.next();
    ...
}
  • 配列 array に対しても以下のように記述可能。
int[] iarray= new int[] { 0, 1, 2, 3, };
for(int i: iarray) {
    System.out.println(i);
}

理解のポイント

  • Collection クラスには、要素型情報 E を Collection<E> などと型パラメータとして、与えています。

  • ArrayList<E> は、Collection<E> の一種(インタフェイスを実装している)。だから、ArrayList<E> なオブジェクトを Collection<E> 型として扱っても大丈夫。

    • TreeSet<E> も同様。
  • だから、addIntegerSamples メソッドは、Collection<E> を実装するすべてのクラスに対して利用可能。

    • で、実際のオブジェクトによって、その振る舞いは異なる。
    • ArrayList は、順番にならべるだけ。
    • TreeSet は、ソートしつつ同じ要素の重複を取り除きます。
    • このように、表現は一つ(Collection<E>) なのに、実体オブジェクトによって振る舞いが異なるという性質を、**polymorphism (多様性,多態性)**と呼びます。
  • obj を表示したいとき、ライブラリは そのクラスの Object#toString() メソッドを勝手に呼んでくれます。(重要!)

    • ArrayList, TreeSet などの toString() は、「要素の表示」までやってくれます。