• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Iteratorの使用について)

Listの要素をIteratorで取得する方法とforループの比較

このQ&Aのポイント
  • Listの要素をIteratorを使用して取得する方法について質問します。
  • List内にListや別のクラスが入っていても、Iteratorを使用することで取得できます。
  • 一般的にはforループよりもIteratorを使用した方が適切です。

質問者が選んだベストアンサー

  • ベストアンサー
  • askaaska
  • ベストアンサー率35% (1455/4149)
回答No.4

> public class MyList extends ArrayList Yes それで正解よ。 さらにtoStringメソッドをオーバーライドして returnに都合のいいような文字列を与えてあげればいいのよ。 あとは List array = new ArrayList(); を List array = new MyList(); にするだけで解決よ。

kannitiha
質問者

お礼

回答ありがとうございます。 無事、解決できました。 長々とご教授ありがとうございました。 また、宜しくお願いします。

その他の回答 (3)

  • askaaska
  • ベストアンサー率35% (1455/4149)
回答No.3

オーバーライドについて勉強するべきね。 toString()はObjectクラスに用意されているメソッドよ。 すべてのJavaクラスはObjectクラスを継承しているから すべてのJavaクラスは必ずtoString()を実行することができるわ。 オーバーライドしないとUserFormBeanなら UserFormBean@1a758cb見たいな出力結果が返ってくるわけ。 たとえばUserFormBeanに @override public String toString() { return "これはUserFormBeanです"; } って実装してあげれば、出力結果が value=UserFormBean@1a758cb ではなく value=これはUserFormBeanです こうなるのよ。

kannitiha
質問者

補足

回答ありがとうございます。 >オーバーライドについて勉強するべきね。 再度、見直します。 UserFormBeanクラスの場合においては、無事、userNameとageを取得できました。 それで、一つ前の回答に戻るのですが、 >自分の好きなように出力してあげれば良いわ。 なおListはそのままだとオーバーライドできないから ArrayListを継承したMyListとか作ってそれを利用すればいいわよ。 というのは、 例えば、ArrayListを継承するクラスとすると public class MyList extends ArrayList { } と言う形で作成できると思うのですが。 以前のgooの質問:http://oshiete1.goo.ne.jp/qa3209121.htmlを参考にしてみました。 この場合どうすべきなのでしょうか? 色々調べるのですが、よくわかりません。 宜しくお願いします。

  • askaaska
  • ベストアンサー率35% (1455/4149)
回答No.2

方法は2つ考えられるわ。 1つは前にも言ったinstanceofで確認する方法。 forループ内で Object o = a.next(); if (o instance UserFormBean) {  -処理- } else if (o instance List) {  -処理- } else if (o instance String) {  -処理- } こう記述することね。 一般的な方法だと思うわ。 2つ目はtoStringメソッドのオーバーライドね。 System.out.println(a.next()); とやったとき、実際には System.out.println(a.next().toString()); が実行されているのよ。 そのため、UserFormBeanやListのtoStringメソッドをオーバーライドして 自分の好きなように出力してあげれば良いわ。 なおListはそのままだとオーバーライドできないから ArrayListを継承したMyListとか作ってそれを利用すればいいわよ。 2つ目のほうが見た目はかっこいいけど 出力の自由度が高いのは1つ目のほうね。

kannitiha
質問者

補足

回答ありがとうございます。 instanceofの方解決できました。 toString()時のことですが、 いろいろ試してみましたが、いまいちわかりません。 文字列におけるtoString()の意味は、何となく理解できるのですが。 toString()で、instanceofのように分けることが可能ということでしょうか? 宜しくお願いします。

  • askaaska
  • ベストアンサー率35% (1455/4149)
回答No.1

???ゴメン 何をしたいのかさっぱりわからないわ。 > //このとき、a.next()から再度UserFormBeanクラスデータを取得したい とあるけど、まずこれの意味がわからないわ。 上のコードには書かれていないけど 多分array.add(userFormBean);を最後に行っているのは結果から推測できるけど。 そもそもListに別の種類のオブジェクトを入れていること自体が普通の使い方ではないので、 ううん、やっちゃいけないわけじゃないけど、一般的ではないわね。 保守性も可読性もよくないし。 くどいけど質問内容を確認させてもらうわね。 > このとき、文字列で入っている場合は、普通に取得できるが、 これは、Listに格納するデータが文字列の場合なら、 取得結果に 「value=ほのか」 みたいに取得できるってことを言っている? > List毎入っている場合と value=[酒蔵] これのこと? > 別クラスが入っている value=UserFormBean@1a758cb これのことよね?多分。 > うまく取得できません どう取得できることを想定しているのかしら? > 普通にfor()を使用すれば取得できるのですが、 あなたのコードは普通にfor文をつかっているようだけど? 恐らくあなたのやりたいことは nextの結果を格納して、instanceofしたあとキャストするだけで解決する と思うんだけどどうかな?

kannitiha
質問者

補足

回答ありがとうございます。 説明不足でした。 再度やり直してみました。 したいのが 1)listに、文字列で格納されている 2)listに、別listで格納されている 3)listに、別クラスで格納されている 場合です。 これを、まず、それぞれで実現すると、 1) List array = new ArrayList(); array.add("ほのか"); array.add("なぎさ"); System.out.println("文字列 for 文 --- ★★ --- "); for(int a=0;a<array.size();a++ ) { System.out.println( array.get(a)); } System.out.println("文字列 iterator -◆◆--- "); for(Iterator ai= array.iterator();ai.hasNext();) { System.out.println( ai.next() ); } result: 文字列 for 文 --- ★★ --- ほのか なぎさ 文字列 iterator -◆◆--- ほのか なぎさ 2) array = new ArrayList(); List array2 = new ArrayList(); array2.add("酒蔵"); array2.add("あかもね"); array.add(array2); List array2_a = new ArrayList(); System.out.println("list内に、listデータ for文 -- ★"); for(int l=0;l<array.size();l++ ) array2_a = (List)array.get(l); for(int li = 0; li<array2_a.size();li++ ) System.out.println(array2_a.get(li)); System.out.println("list内に、listデータ iterator -- ◆"); for(Iterator l2 = array.iterator();l2.hasNext(); ) array2_a = (List) l2.next(); for(Iterator l2_a = array2_a.iterator();l2_a.hasNext(); ) System.out.println(l2_a.next() ); result: list内に、listデータ for文 -- ★ 酒蔵 あかもね list内に、listデータ iterator -- ◆ 酒蔵 あかもね 3) array = new ArrayList(); userFormBean.setUserName("あかね"); userFormBean.setAge(15); array.add(userFormBean); System.out.println("別クラス(UserFormBean)型 for文 -- "); for(int u=0;u<array.size();u++ ) { UserFormBean userFormBean = (UserFormBean)array.get(u); System.out.println(userFormBean.getUserName()); System.out.println(userFormBean.getAge()); } System.out.println("別クラス(UserFormBean)型 iterator -- "); for(Iterator u2=array.iterator();u2.hasNext(); ) { userFormBean = (UserFormBean)u2.next(); System.out.println(userFormBean.getUserName()); System.out.println(userFormBean.getAge()); } result: 別クラス(UserFormBean)型 for文 -- あかね 15 別クラス(UserFormBean)型 iterator -- あかね 15 となるのですが、考え方としてどうなのでしょうか? また、1-3を一つの処理にまとめて取得しようとした場合(おそらくはありえない)それを実現することは可能なのでしょうか? >そもそもListに別の種類のオブジェクトを入れていること自体が普通の使い方ではないので、、、、 理由として、dbから複数のデータを取得する際に、 userとageがあるので、UserFormBeanに一度格納し、listにまとめて取得しようと思ったのですが。 ※配列をしようとすると、サイズが決まっていないといけないので、 listが一番取得しやすいと考えました。 宜しくお願いします。