ユーティリティ 2章 ListとIterator
2.2. java.util.Iterator, java.util.ListIterator
「java.util.Iterator」は「Enumeration」の代わりとして導入されたインタフェースです。「List」インタフェースを実装するクラスでは、「iterator」メソッドで「Iterator」インタフェースを得る事ができます。以下はメソッド一覧と使用例です。
boolean hasNext() | 順方向に、リストが次の要素を持っていたら「true」を返す |
Object next() | 順方向の次の要素を返す |
void remove() | 直前の「next」または「previous」で取得したオブジェクトを削除する |
Iterator iterator = list.iterator(); while(iterator.hasNext()) { String country = (String)iterator.next(); if(country.equals("Japan")) { iterator.remove(); } }
「Enumeration」と「Iterator」の違いは2点あります。1つはサンプルのように、「Iterator」には要素を削除するメソッド(「remove」)も提供されている事。「Iterator」に対して要素の削除をすると、元のリストに対して削除が実行されます。ただし実装クラスによっては、削除のメソッドを提供しない場合があります。その場合は「java.lang.UnsupportedOperationException」例外を発生します。
2点目は元のリストオブジェクトに対して直接データの操作が行われた場合、「Iterator」では「java.util.ConcurrentModificationException」例外が発生して使用できなくなる点です。「Enumeration」はそのまま使用できますので、参照しているデータがずれてしまったりします。
「ListIterator」は、「List」の「listIterator」メソッドで提供されるインタフェースです。「Iterator」に加えて要素を前に辿るメソッドや追加・変更を行うメソッドを提供しています。以下はメソッドの一覧と使用例です。
boolean hasNext() | 順方向に、リストが次の要素を持っていたら「true」を返す |
Object next() | 順方向の次の要素を返す |
int nextIndex() | 順方向の次の要素のインデックスを返す |
boolean hasPrevious() | 逆方向に、リストが次の要素を持っていたら「true」を返す |
Object previous() | 逆方向の次の要素を返す |
int previousIndex() | 逆方向の次の要素のインデックスを返す |
void add(Object) | 現在の位置に引数で指定したオブジェクトを挿入する |
void set(Object) | 直前の「next」または「previous」で取得したオブジェクトを、引数で指定したオブジェクトで置き換える |
void remove() | 直前の「next」または「previous」で取得したオブジェクトを削除する |
ListIterator listIterator = list.listIterator(); ... while(listIterator.hasPrevious()) { int index = listIterator.previousIndex(); String country = (String)listIterator.previous(); }
(実習課題2)
以下のウィンドウ・プログラムを作成しなさい。
- 「List」に対して、任意の「String」オブジェクトを10個以上追加する事。
- 「ListIterator」インタフェースで提供されているメソッド(「前へ」「後ろへ」)に対応するボタンを2つ用意し、それぞれ押した場合に要素の内容がラベルに表示されるようにする事。