コードメモ > デザインパターン > イテレータ


※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

ある集合があって、それをnext,hasNextなどを利用して要素へアクセスできるイテレータというインタフェースを作ってやる。

java(写経) from Javaで学ぶデザインパターン

public class Entry {
  public static void main(String[] arg) {
    BookShelf bookShelf = new BookShelf(2);
    String[] strs = {"hoge","hige","hage","huge","hige","hage"};
    for(int i=0;i<6;i++){
      bookShelf.appendBook(new Book(strs[i])); 
    }   
    for(Iterator it = bookShelf.iterator();
        it.hasNext();){
      Book book = (Book) it.next();
      System.out.println(book.getName());
    }   
  }
}

動いてるコードを動かなくしないような改変をしたつもり。

コレクションにはイテレータインタフェースを生成するメソッドを。

import java.util.ArrayList;
class BookShelf implements Aggregate{
  //private Book[] books;
  ArrayList<Book> books;
  public BookShelf(int maxsize){
    this.books = new ArrayList<Book>();
  }
  public Book getBookAt(int index){
    return books.get(index);
  }
  public void appendBook(Book book){
    this.books.add(book);
  }
  public int getLength(){
    return books.size();
  }
  public Iterator iterator() {
    return new BookShelfIterator(this);
  }
}

アイテムはノンタッチ。

class Book{
  private String name;
  public Book(String name){
    this.name=name;
  }
  public String getName(){
    return name;
  }
}

吐き出すメソッドをよういしろ!の指示。

public interface Aggregate{
  public abstract Iterator iterator();
}

nextとhasNextを用意しろの指示。

interface Iterator{
  public abstract boolean hasNext();
  public abstract Object next();
}

python

yield付きのfunctionでイテレータを作成可能。

class Aggregate:
  def iterator(self):
    def iter_func():
      for item in self.collection:
         yield item
    return iter_func

など。なんとでもなりんす。

C++

あとで追記。