Collection の基本的な使い方
まずは、整数要素を java.util.ArrayList に入れてみましょう。 ソート機能付き java.util.TreeSet でも試しましょう。
なにをしているかというと、ArrayList
(配列を用いたリスト)や TreeSet
(順序付きSet) に、整数値をいくつか入れてから、その要素を順番に表示しているだけです。
プログラム例
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.ArrayList: 配列をつかって実現された
java.util.TreeSet<Integer>
: Integer を要素に持つjava.util.TreeSet
- クラス java.util.TreeSet: ソート機能つきの
java.util.Set
- インタフェイス java.util.Set: 要素の重複を許さない
java.util.Collection
- インタフェイス java.util.Collection: 同上
- クラス 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()
は、「要素の表示」までやってくれます。