CIterator

提供: Kiruah's Page
移動: 案内検索

概要

CIterator(シーイテレーター)は、通常のIteratorを拡張します。 具体的には現在処理中の件数を内部でカウントアップします。


使い方

通常の利用方法

内部はIteratorを包含しているため、Iterator同様の利用が可能です。 ですが、この場合はCIteratorを利用するメリットはありません。

ArrayList<String> list;

CIterator<String> iterator = new CIterator(list.iterator());

CIteratorは下記のような実装を行う必要がある場合に有効です。

実装例1

ArrayList<String> list;
int size = list.size();

for (int i = 0; i < size; i++) {
    System.out.println(i + ":" + list.get(i));
}

実装例2

ArrayList<String> list;
Iterator<String> iterator = list.iterator();
int i = 0;

while (iterator.hasNext()) {
    System.out.println(i + ":" + iterator.next());
    i++;
}

実装例1ではカウンタのためにforを利用しています。通常Iteratorで記述出来る箇所がiのためにforループ化されています。 逆に、実装例2ではIteratorで実装しています。そのため、自分自身でiをカウントアップする必要があります。


上記のようなコードに対してCIteratorではCIterator内部でカウンタを保持しているため、下記のように記述できます。

ArrayList<String> list;
CIterator<String> iterator = new CIterator(list);

while (iterator.hasNext()) {
    System.out.println(iterator.getIndex() + ":" + iterator.next());
}

コンストラクタ

CIteratorはデフォルトではIteratorインスタンスを引き渡しますが、コンストラクタに直接Collection型、Map型、配列型のデータを指定できます。 配列型では通常Iteratorは提供されませんが、CIterator内部でカウンタを持つため、Iterator同様に配列にアクセス可能です。 よって、Collection、Map、配列それぞれに対して共通のアクセス方法を提供しています。

  • Iteratorの場合
Iterator<String> localIterator;
CIterator<String> iterator = new CIterator(localIterator);
  • Collectionの場合
Collection<String> list;
CIterator<String> iterator = new CIterator(list);
  • Mapの場合は、EntryのIteratorが返却されます。
Map<String, Integer> map;
CIterator<Entry<String, Integer>> iterator = new CIterator(map);
  • 配列の場合
String[] array;
CIterator<String> iterator = new CIterator(array);


コンストラクタ(読み飛ばし)

コンストラクタの第2引数に数値を入れると、数値件数分スキップします。

  • Iteratorの場合
Iterator<String> localIterator;
CIterator<String> iterator = new CIterator(localIterator, 1);
  • Collectionの場合
Collection<String> list;
CIterator<String> iterator = new CIterator(list, 1);
  • Mapの場合は、EntryのIteratorが返却されます。
Map<String, Integer> map;
CIterator<Entry<String, Integer>> iterator = new CIterator(map, 1);
  • 配列の場合
String[] array;
CIterator<String> iterator = new CIterator(array, 1);


読み飛ばし

CIteratorではデータの読み飛ばし(スキップ機能)を提供しています。 読み飛ばしたい件数をskipメソッドに指定します。

CIterator<Object> iterator;

iterator.skip(2); // 2件スキップ


カウンタ値の取得

CIteratorでは、現在処理中のインデックス番号及び、next()で取得したデータ件数を取得できます。

  • 現在処理中のインデックス番号の取得(next()を1回実行した場合および未実行の場合は0が返却されます)
CIterator<Object> iterator;

int index = iterator.getIndex();
  • 現在取得済みのデータ件数の取得
CIterator<Object> iterator;

int count = iterator.getCount();


next()実行済みの確認

以下のメソッドを利用することで、next()メソッドを未実行かどうかを取得できます。

CIterator<Object> iterator;

boolean result = iterator.isNotNext();

もしtrueが返却された場合は未実行です。 これは以下のコードの代替になります。

CIterator<String> i;
boolean notExecuted = true;

while (i.hasNext()) {
    i.next();
    notExecuted = false
}

boolean result = i.isNotNext();


拡張for

CIteratorは拡張for文でも利用可能です。

ArrayList<String> list;
CIterator<String> iterator = new CIterator<String>(list);

for (String s : iterator) {
    System.out.println(iterator.getIndex() + " : " + s);
}

拡張for文の中でもCIteratorインスタンスからgetIndex()メソッド等にアクセス可能です。


pushBack機能

通常、Iteratorでは読みすぎた場合、元に戻ることはできません。そのため一時的にでもどこかのバッファに残し、バッファがある方から読み取る必要があります。 CIteratorでは読みすぎた場合、一度CIteratorに戻すことができます。

ArrayList<String> list;
CIterator<String> iterator = new CIterator<String>(list);

String value = null;

value = iterator.next();
iterator.pushBack(value);
value = iterator.next();  // 2行上のvalueと同じインスタンスが返却されます

pushBack機能を利用し、内部バッファに要素がある場合は下記のセーブポイント機能を利用できません。


セーブポイント機能

セーブポイントを設定すると、指定時点のイテレータの位置を1箇所保存することができます。 一度savePointを設定すると、nextを実行後loadPointメソッドで元の位置に戻ります。下記のコードは2回同じ内容が出力されます。 ただし、savePoint利用時はpushBack機能を利用できません。

ArrayList<String> list;
CIterator<String> iterator = new CIterator<String>(list);

iterator.savePoint();

for (int i = 0; i < 5; i++) {
     System.out.println(iterator.next());
}

iterator.loadPoint();

for (int i = 0; i < 5; i++) {
     System.out.println(iterator.next());
}


removeメソッドについて

CIteratorではremove()メソッドは利用できないようにしています。 実行した場合、UnsupportedOperationException()がスローされます。