汎用的な機能をまとめて、アプリケーションの土台となるソフトウェアは
フレームワークと呼ばれます。(J2SE 5.0より)
そして、JavaではJCF(Java Collections Framework)と
呼ばれるクラス群で提供されています。
これは単に、コレクションと呼ばれます。
そして、Javaでは、内部的にはObject型で管理されますがGenerics対応クラス群になっています。
Listインターフェイスを継承した配列構造のArrayLiat、 リンク構造のLinkedListがあります。
ArrayListに相当するもので、以前からVectorクラスが存在します。 まだVectorも使用できますが、互換性を保つために残っていると言えます。 (同様に、Hashtableも互換性のために残っています) Vectorクラスは、Enumerationインターフェイスを利用して、反復などの繰り返しを 行う構造でした。
for (Enumeration e = v.elements() ;
e.hasMoreElements() ;) { System.out.println(e.nextElement()); }
Collectionでは、このEnumerationの代わりに、
Iteratorを反復子に使うよう代わりました。
(呼び出し側で、明確なセマンティクスに基づく反復中の要素削除が可能になりました。
これより、反復子を利用する新しいクラスは、
Enumerationでなく、
Iteratorを使うべきとされています。
)
同時に、これより拡張 for 文が使えるようになりました。
これは、
Iterable インタフェースをインプリメントしたクラスで
使えます。
以下に、lstが、LinkedListやArrayListのどで、要素がStringデータの場合の例を
示します。
Iterator <String> iter = lst.iterator();
while(iter.hasNext()){
String s = iter.next();
System.out.println(s);
}
上記が次のように書けるということです。
for (Object o : list) {
System.out.println((Integer)o);
}
そのためには、次のようなIterableクラスを継承して、集合クラスを作ります。 (説明のためのソースで実際と異なっています。)
public interface Iterable<T> {
Iterator<T> iterator();
}
このIterable継承の集合で管理される要素で、次もイメージの Iteratorを継承させます。 (説明のためのソースで実際と異なっています。)
public interface Iterator<E> {
boolean hasNext();
E next();
void remove();
}
イテレータとは、各要素に対する繰返し処理の抽象化し、 それに対する操作方法を提供するものです。 この具体的な例として LinkedListイメージでの利用例を示します。 (説明のためのソースで実際と異なっています。)
class LinkedList <E> implements Iterable<E>{
class Node {
E data; //データ
Node next; //次のノード
Node(E obj){
data = obj;
}
}
Node startNode;
Node endNode;
private class Itr implements Iterator<E>{
Node current;
public Itr(){
current = startNode;
}
public boolean hasNext() {// 繰り返し処理でさらに要素がある場合にtrue を返します。
return current!=null;
}
public E next(){// 繰り返し処理で次の要素を返します。
Node rtnNode = current;
current = current.next;
return rtnNode.data;
}
public void remove() {
throw new UnsupportedOperationException();
}
}
int size;
public boolean add(E obj){
if(endNode==null){
startNode = endNode = new Node(obj);
} else {
endNode = endNode.next = new Node(obj);
}
size++;
return true;
}
public int size(){//サイズ取得
return this.size;
}
public E remove(int index){
Node w = startNode;
if(--size == 0){
startNode = endNode = null;
} else if(index == 0){
startNode = startNode.next;
} else {
while(--index > 0) w = w.next;
Node w2 = w;
w = w.next;
w2.next = w2.next.next;
}
return w.data;
}
public Iterator<E> iterator() {
return new Itr();
}
void display(){
for(Node w = startNode; w != null; w = w.next){
System.out.println(w.data);
}
System.out.println("size:"+size);
}
}