Iterator

iterator.png

stl-iterator

定義

内部表現を公開することなくコンテナオブジェクトの要素に順次アクセスする方法を提供します

どんな時に使う?

同じオブジェクトだけど、違うクラスには、違うコンテナで入っている。
同じListならいいけど、ナマの配列とArrayListだったら??

Iteratorインタフェース

java.util.Iteratorという公式のインタフェースがあります
たった3っつの関数だけ★
実装すべき関数名 説明
boolean hasNext() 繰り返し処理でさらに要素がある場合に true を返します。
T next() 繰り返し処理で次の要素を返します。
void remove() 基になるコレクションから、反復子によって最後に返された要素を削除します (実装してもしなくてもどっちでもいい)。

実装の仕方

ArrayListで詰め込んであるクラスと、
ナマの配列で詰め込んであるクラスがあるとする。
双方のクラスにimplements IteratorしてIteratorインタフェースを実装する。

Iteratorを実装したクラスの例

public class DinerMenuIterator implements Iterator{
    MenuItem[] items;//走査したい配列データ
    int position=0;//現在の走査位置 これ大事
    public DinerMenuIterator(MenuItem[] items){//コンストラクタ
          items=items;
}
public Object next(){
     MenuItem menuItem = items[position];
     position=position+1;
     return menuItem;
}
public boolean hasNext(){
     if(position>=items.length||items[position]==null){
          return fase;
      }else{
          return true;
       }
 
}
public void remove(){
    if(position<=0){
         throw new IllegalStateException("少なくとも1回next()実行するまでは項目を削除できません");
     }
     if(list[position-1] != null){
          for(int i=position-1;i<(list.length-1);i++){
                list[i]=list[i+1];
           }
           list[list.length-1]=null;
      }
}

Iteratorを実装したクラスを使う側のコード

Iterator iterator=MyClass.createIterator();
while(iterator.hasNext()){
    iterator.next();//インクリメントもしてくれる。
}

コードの例

ArrayListでmenuItemを実装 ナマの配列でmenuItemを実装
package iterator;
import java.util.ArrayList;
import java.util.Iterator;
public class PancakeHouseMenu implements Menu {
    ArrayList<MenuItem> menuItems;
    public PancakeHouseMenu() {
        menuItems = new ArrayList<MenuItem>();
        addItem("K&B's Pancake Breakfast", "Pancakes with scrambled eggs, and toast", true,2.99);
        addItem("Regular Pancake Breakfast", "Pancakes with fried eggs, sausage", false,2.99);
        addItem("Blueberry Pancakes","Pancakes made with fresh blueberries",true,3.49);
        addItem("Waffles","Waffles, with your choice of blueberries or strawberries",true,3.59);
    }
package iterator;
import java.util.Iterator;
public class DinerMenu implements Menu {
    static final int MAX_ITEMS = 6;
    int numberOfItems = 0;
    MenuItem[] menuItems;
    public DinerMenu() {
        menuItems = new MenuItem[MAX_ITEMS];
        addItem("Vegetarian BLT","(Fakin') Bacon with lettuce & tomato on whole wheat", true, 2.99);
        addItem("BLT","Bacon with lettuce & tomato on whole wheat", false, 2.99);
        addItem("Soup of the day","Soup of the day, with a side of potato salad", false, 3.29);
        addItem("Hotdog","A hot dog, with saurkraut, relish, onions, topped with cheese",false, 3.05);
        addItem("Steamed Veggies and Brown Rice","Steamed vegetables over brown rice", true, 3.99);
        addItem("Pasta","Spaghetti with Marinara Sauce, and a slice of sourdough bread",true, 3.89);
    }
普通に実装 メニューをある特定のサイズ内に思っている
    public void addItem(String name, String description,boolean vegetarian, double price)
    {//メニュー項目を追加するために、各引数を渡して新しいMenuItemオブジェクトを作成し、それをArrayListに追加する
        MenuItem menuItem = new MenuItem(name, description, vegetarian, price);
        menuItems.add(menuItem);
    }
    public void addItem(String name, String description,boolean vegetarian, double price) 
    {
        MenuItem menuItem = new MenuItem(name, description, vegetarian, price);
        if (numberOfItems >= MAX_ITEMS) {
            System.err.println("Sorry, menu is full!  Can't add item to menu");
        } else {
            menuItems[numberOfItems] = menuItem;
            numberOfItems = numberOfItems + 1;
        }
    }

サポートサイト Wikidot.com