質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

デザインパターン

デザインパターンは、ソフトウェアのデザインでよく起きる問題に対して、解決策をノウハウとして蓄積し再利用出来るようにした設計パターンを指します。

Q&A

解決済

1回答

18210閲覧

【デザインパターン】Iteratorパターンを使うべきケースが理解できません。

takenyaan

総合スコア119

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

デザインパターン

デザインパターンは、ソフトウェアのデザインでよく起きる問題に対して、解決策をノウハウとして蓄積し再利用出来るようにした設計パターンを指します。

0グッド

3クリップ

投稿2015/06/13 16:18

編集2015/06/13 16:21

「Java言語で学ぶデザインパターン入門」を元にデザインパターンを学習していますが、
Iteratorパターンを使うべきケースが理解できません。

書籍内のサンプルでは本の集合を表すBookShelfクラスにて、下記2つのメソッドを定義しています。
・本の冊数を返す。 int getLength ( )
・index番目の本を返す。 Book getBookAt ( int index )

MainクラスにてIteratorパターンを用いて、下記のように走査してますが、

lang

1Iterator it = book_shelf.iterator(); 2 while(it.hasNext()) { 3 Book book = (Book)it.next(); 4 System.out.println(book.getName()); 5 }

Iteratorパターンを用いずに下記のようなfor文で問題ないと考えてます。

lang

1 for (int i = 0; i < bookShelf.getLength(); i++) { 2 Book book = bookShelf.getBook(i); 3 System.out.println(book.getName()); 4 }

Iteratorパターンのメリットは

BookShelfクラスの実装を、現状の配列ではなく、Vectorを使うようにしても、BookShelfクラスを利用する側は変更しなくて済む。

と説明されてますが、これは「int getLength()」メソッドと「Book getBookAt()」が同じように機能するのであれば、forループの場合と比べて何ら変わりありません。

上記を踏まえた上で、Iteratorパターンのメリット、使うべきケースについてご教示頂けますと幸いです。

なお、似たような記事を見つけましたが、こちらの内容ではいまいち理解できませんでした。

http://www.aerith.net/design/Iterator-j.html

下記、参考までにソースを記載致します。

Aggregate.java

lang

1public interface Aggregate { 2 3 public abstract Iterator iterator(); 4}

Iterator.java

lang

1public interface Iterator { 2 public abstract boolean hasNext(); 3 public abstract Object next(); 4}

BookShelf.java

lang

1import java.util.*; 2 3public class BookShelf implements Aggregate { 4 5 private List<Book> books = new ArrayList<Book>(); 6 public Book getBook(int index) { 7 return books.get(index); 8 } 9 public void appendBook(Book book) { 10 books.add(book); 11 } 12 public int getLength() { 13 return books.size(); 14 } 15 public Iterator iterator() { 16 return new BookShelfIterator(this); 17 } 18}

BookShelfIterator .java

lang

1public class BookShelfIterator implements Iterator { 2 3 private BookShelf bookShelf; 4 private int index; 5 6 public BookShelfIterator(BookShelf bookShelf) { 7 this.bookShelf = bookShelf; 8 this.index = 0; 9 } 10 11 public boolean hasNext() { 12 if (index < bookShelf.getLength()) { 13 return true; 14 } else { 15 return false; 16 } 17 } 18 19 public Object next() { 20 Book book = bookShelf.getBook(index); 21 index++; 22 return book; 23 } 24}

Main.java

lang

1public class Main { 2 3 public static void main(String[] args) { 4 5 BookShelf bookShelf = new BookShelf(); 6 bookShelf.appendBook(new Book("Around the World in 80 Days")); 7 bookShelf.appendBook(new Book("Bible")); 8 bookShelf.appendBook(new Book("Cinderella")); 9 bookShelf.appendBook(new Book("Daddy-Long-Legs")); 10 11 Iterator it = bookShelf.iterator(); 12 13 while(it.hasNext()) { 14 Book book = (Book)it.next(); 15 System.out.println(book.getName()); 16 } 17 18 //for (int i = 0; i < bookShelf.getLength(); i++) { 19 // Book book = bookShelf.getBook(i); 20 // System.out.println(book.getName()); 21 //} 22 } 23}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

メリットの1つは、コレクションのサイズを知る必要が無い、ということです。

例えば、イテレーションの開始時点でサイズが未定だとしたら、for文の場合は書けませんが、Iteratorならば「次の要素があるかどうか」「次の要素を取得」という操作さえ用意されていれば処理できます。

また、indexを指定して「何番目の要素」を取得する操作(ランダムアクセス)が提供できない、もしくは提供が難しい(indexから要素の位置を特定するのが難しい種類の)コレクションにも適用できます。
この一例は、HashSetクラスです。
HashSet (Java SE 8 API ドキュメント)

このように、さまざまな種類のコレクションに適用できるのがメリットです。

投稿2015/06/13 16:48

編集2015/06/13 17:01
argius

総合スコア9394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takenyaan

2015/06/13 16:51

さっそくのご回答ありがとうございます。 下記が具体的にイメージできないのですが、どのようなコレクションになるでしょうか。 >indexを指定して「何番目の要素」を取得する操作(ランダムアクセス)が提供できない、 >もしくは提供が難しい(indexから要素の位置を特定するのが難しい種類の)コレクションにも適用できます。
argius

2015/06/13 17:05

追記しました。具体例はHashSetです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問