interface Aggregate {
}
public abstract boolean hasNext();
public abstract Object next
(); }
public String getName
() { return name
; } }
class BookShelf implements Aggregate {
private java.util.ArrayList<Book> books;
public BookShelf(int maxsize) { /* constructor */
this.books = new java.util.ArrayList<Book>(maxsize);
}
Book getBookAt
(int index
) { /* called from iterator */ return books.get(index);
}
public int getLength() { return books.size(); } /* called from iterator */
public Iterator iterator
() { /* called form iterator; make iterator */ return new BookShelfIterator(this);
}
public void appendBook
(Book book
) { /* utility for main */ this.books.add(book);
}
}
class BookShelfIterator
implements Iterator { private BookShelf bookShelf;
private int index;
public BookShelfIterator(BookShelf bookShelf) { /* constructor */
this.bookShelf = bookShelf;
this.index = 0;
}
public boolean hasNext() {
if (index < bookShelf.getLength()) return true;
else return false;
}
Book book
= bookShelf.
getBookAt(index
); index++;
return book;
}
}
class Main {
public static void main
(String[] args
) { BookShelf bookShelf = new BookShelf(4);
bookShelf.
appendBook(new Book("Around the World in 80 Days")); bookShelf.
appendBook(new Book("Bible")); bookShelf.
appendBook(new Book("Cinderella")); bookShelf.
appendBook(new Book("Daddy-Long-Legs")); bookShelf.
appendBook(new Book("EinStein")); bookShelf.
appendBook(new Book("Faraday")); while (it.hasNext()) {
System.
out.
println("" + book.
getName()); }
}
}
/* end */
aW50ZXJmYWNlIEFnZ3JlZ2F0ZSB7CiAgcHVibGljIGFic3RyYWN0IEl0ZXJhdG9yIGl0ZXJhdG9yKCk7Cn0KCmludGVyZmFjZSBJdGVyYXRvciB7CiAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaGFzTmV4dCgpOwogIHB1YmxpYyBhYnN0cmFjdCBPYmplY3QgbmV4dCgpOwp9CgpjbGFzcyBCb29rIHsKICBwcml2YXRlIFN0cmluZyBuYW1lID0iIjsKICBwdWJsaWMgQm9vayhTdHJpbmcgbmFtZSkgeyB0aGlzLm5hbWUgPSBuYW1lOyB9CiAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeyByZXR1cm4gbmFtZTsgfQp9CgpjbGFzcyBCb29rU2hlbGYgaW1wbGVtZW50cyBBZ2dyZWdhdGUgewogIHByaXZhdGUgamF2YS51dGlsLkFycmF5TGlzdDxCb29rPiBib29rczsKICBwdWJsaWMgQm9va1NoZWxmKGludCBtYXhzaXplKSB7IC8qIGNvbnN0cnVjdG9yICovCiAgICB0aGlzLmJvb2tzID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3Q8Qm9vaz4obWF4c2l6ZSk7CiAgfQogIEJvb2sgZ2V0Qm9va0F0KGludCBpbmRleCkgeyAvKiBjYWxsZWQgZnJvbSBpdGVyYXRvciAqLwogICAgcmV0dXJuIGJvb2tzLmdldChpbmRleCk7CiAgfQogIHB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgeyByZXR1cm4gYm9va3Muc2l6ZSgpOyB9IC8qIGNhbGxlZCBmcm9tIGl0ZXJhdG9yICovCiAgcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCkgeyAvKiBjYWxsZWQgZm9ybSBpdGVyYXRvcjsgbWFrZSBpdGVyYXRvciAqLwogICAgcmV0dXJuIG5ldyBCb29rU2hlbGZJdGVyYXRvcih0aGlzKTsKICB9CiAgcHVibGljIHZvaWQgYXBwZW5kQm9vayhCb29rIGJvb2spIHsgLyogdXRpbGl0eSBmb3IgbWFpbiAqLwogICAgdGhpcy5ib29rcy5hZGQoYm9vayk7CiAgfQp9CgpjbGFzcyBCb29rU2hlbGZJdGVyYXRvciBpbXBsZW1lbnRzIEl0ZXJhdG9yIHsKICBwcml2YXRlIEJvb2tTaGVsZiBib29rU2hlbGY7CiAgcHJpdmF0ZSBpbnQgaW5kZXg7CgogIHB1YmxpYyBCb29rU2hlbGZJdGVyYXRvcihCb29rU2hlbGYgYm9va1NoZWxmKSB7IC8qIGNvbnN0cnVjdG9yICovCiAgICB0aGlzLmJvb2tTaGVsZiA9IGJvb2tTaGVsZjsKICAgIHRoaXMuaW5kZXggPSAwOwogIH0KICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewogICAgaWYgKGluZGV4IDwgYm9va1NoZWxmLmdldExlbmd0aCgpKSByZXR1cm4gdHJ1ZTsKICAgIGVsc2UgcmV0dXJuIGZhbHNlOwogIH0KICBwdWJsaWMgT2JqZWN0IG5leHQoKSB7CiAgICBCb29rIGJvb2sgPSBib29rU2hlbGYuZ2V0Qm9va0F0KGluZGV4KTsKICAgIGluZGV4Kys7CiAgICByZXR1cm4gYm9vazsKICB9Cn0KCmNsYXNzIE1haW4gewogIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKICAgIEJvb2tTaGVsZiBib29rU2hlbGYgPSBuZXcgQm9va1NoZWxmKDQpOwogICAgYm9va1NoZWxmLmFwcGVuZEJvb2sobmV3IEJvb2soIkFyb3VuZCB0aGUgV29ybGQgaW4gODAgRGF5cyIpKTsKICAgIGJvb2tTaGVsZi5hcHBlbmRCb29rKG5ldyBCb29rKCJCaWJsZSIpKTsKICAgIGJvb2tTaGVsZi5hcHBlbmRCb29rKG5ldyBCb29rKCJDaW5kZXJlbGxhIikpOwogICAgYm9va1NoZWxmLmFwcGVuZEJvb2sobmV3IEJvb2soIkRhZGR5LUxvbmctTGVncyIpKTsgICAgCiAgICBib29rU2hlbGYuYXBwZW5kQm9vayhuZXcgQm9vaygiRWluU3RlaW4iKSk7CiAgICBib29rU2hlbGYuYXBwZW5kQm9vayhuZXcgQm9vaygiRmFyYWRheSIpKTsKICAgIEl0ZXJhdG9yIGl0ID0gYm9va1NoZWxmLml0ZXJhdG9yKCk7CiAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7CiAgICAgIEJvb2sgYm9vayA9IChCb29rKWl0Lm5leHQoKTsKICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIiICsgYm9vay5nZXROYW1lKCkpOwogICAgfQogIH0KfQovKiBlbmQgKi8KICA=