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

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

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

Genericsはパラメトリックなポリモーフィズムの形態であり、.NET やJavaなど、様々な言語に実装されています。C++のテンプレートと同等の機能を持ち合わせています。

iteratorパターン

iteratorパターンとは、オブジェクト指向プログラミングのデザインパターンです。コンテナオブジェクトの要素を列挙する手段を独立させることによって、コンテナの内部仕様に依存しない反復子を提供することを目的とします。

Java

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

Q&A

解決済

1回答

2757閲覧

GenericsのArrayListでの、Iteratorの拡張forの使い方。

退会済みユーザー

退会済みユーザー

総合スコア0

Generics

Genericsはパラメトリックなポリモーフィズムの形態であり、.NET やJavaなど、様々な言語に実装されています。C++のテンプレートと同等の機能を持ち合わせています。

iteratorパターン

iteratorパターンとは、オブジェクト指向プログラミングのデザインパターンです。コンテナオブジェクトの要素を列挙する手段を独立させることによって、コンテナの内部仕様に依存しない反復子を提供することを目的とします。

Java

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

0グッド

0クリップ

投稿2017/09/29 22:23

Genericを使用したArrayListをインターフェイスにしたStackクラスを作ったのですが、そのStackクラスをそのまま使って(または追加でcollectionクラスを使用して)Iteratorの拡張forを使いたいのですが、エラーが表示されてしまい、うまくいきません。よろしくお願いします。

Java

1public class Test{ 2 public static void main(String[] args) { 3 Stack<Integer> s = new Stack<Integer>(); 4 s.push(1); s.push(2); s.push(3); s.push(4); 5 **ここで、sを使用した拡張for(下記のコード)を実行したいのですが、うまくいきません。** 6 for (Integer i: s) { 7 System.out.println(i); 8 } 9 } 10 11 12 13public class Stack<T>{ 14 private List<T> list; 15 16 public Stack() { 17 list = new ArrayList<T>(); 18 } 19 20 public void push(T t) { 21 list.add(t); 22 } 23 24public Iterator<T> iterator() { 25 List<T> iter = new LinkedList<T>(); 26 return iter.iterator(); 27 } 28}

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

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

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

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

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

guest

回答1

0

ベストアンサー

Stack<T>がIterable<T>を実装していることを明記すればよいです。

NG: public class Stack<T> { ... }
=>
OK: public class Stack<T> implements Iterable<T> { ... }

拡張for文が使えるための条件は、for文のコロンの右側の式の型が配列であるかまたはIterable<E>であることですが、単にIterator<E> iterator()メソッドが定義してあればIterable<E>であるとみなされるのではなくクラス宣言部でimplements Iterable<E>と明記して初めてIterable<E>であると認められるのです。

投稿2017/09/29 22:56

KSwordOfHaste

総合スコア18394

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

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

退会済みユーザー

退会済みユーザー

2017/09/30 00:46

丁寧な回答ありがとうございます。 修正したところ、エラーは出なくなったのですが、拡張for文の出力がされません。 何が不足しているのでしょうか?
KSwordOfHaste

2017/09/30 00:57

不足しているのではなくiteratorの実装に間違いがあるのです。 new LinkedList<T>(); とかくと空のLinkedListができますね?それのiteratorを返しても要素は何もないわけです。 Stackの現在の要素をlistに保持させているのですから(それのインデックス順に列挙すればいいのであれば) iteratorの実装はreturn list.iterator();などと書くべきです。
KSwordOfHaste

2017/09/30 01:16 編集

えーと、スタックですね・・・スタックのトップから列挙すべきなのかも知れません。もしそうなら逆順にしなければならないので、例えば次のようにかけます。 @Override public Iterator<T> iterator() { List<T> temp = new ArrayList<>(list); Collections.reverse(temp); return temp.iterator(); } このコードは「簡単に実装するためのもの」であり一時的にArrayListを生成しているので効率的にはベストとは言えません。効率のよい実装にはIteratorのhasNext/nextメソッドを自前で実装するべきですが、ちょっと難しくなるので別途考えてみてください。
退会済みユーザー

退会済みユーザー

2017/09/30 01:19 編集

iteratorの実装にも誤りがあったのですね。修正したところ、うまく出力されました。 ありがとうございました。 追記:わかりました。最近Iteratorなどを勉強し始めたので、もう少し理解が深まったら効率の良い実装を考えてみます。ありがとうございました。
swordone

2017/09/30 01:23

というか、LinkedListが使えるならそれをそのままStackとして使えばいいのでは…というのは野暮でしょうか?
KSwordOfHaste

2017/09/30 02:24

自前でスタッククラスを実装するという意味では内部実装はswordoneさんのご意見のとおりLinkedListの方が(正方向、逆方向のIteratorが簡単に利用できるので)使い勝手がよいと思います。よりよい選択ができるように色々なCollectionの実装クラスの特徴を学んでいくといいんじゃないでしょうか。自前でStackなどを実装することを通じていろいろと学べることがあると思います。一つの実装を作ってそれで終わりではなく・・・ A:ArrayListでStackを実装 B:ArrayListの代わりにLinkedListを使う C:他にもっと使いやすいクラスがあるかCollectionのクラスを研究してみる D:ArrayDequeなどをスタックとしてそのまま用いる(大抵の場合それがベストだと思います) といった具合に考えが進んでいくのではないでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問