- - PR -
iteratorの中で、iteratorで回す方法
| 投稿者 | 投稿内容 | ||||||||
|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2004-08-31 16:34
iteratorの中で、iteratorで回す方法について
質問が御座います。 以下のように、 RequestInfo とResponseInfoの二つのクラスがあります。また、 ResultMessageクラス は、属性として、 RequestInfoのリスト ResponseInfoのリスト を持っております(つまり、RequestInfo-ResultMessage,ResponseInfo-ResultMessage の二つのクラスの関係はCompositionの関係にあります) やりたい事は、 RequestInfo とResponseInfoのオブジェクトを二つ作成し(reqInfo1,reqInfo2,resInfo1,resInfo2) 値を設定します。そして再度、値を 取り出したいと考えております。この時、 reqInfo1 resInfo1 reqInfo2 resInfo2 の順番で値を取り出したいのですが、うまくいきません。具体的には、 下記のように、iteratorの中で、iteratorで回せばよいのかと 思ったのですが、やりたい事は違う動きです。 (二つのリストを同時に処理するときは iteratorの中で、iteratorを回す事自体があまりいい方法では ないのでしょうか?indexを用いてループを回した方がいいのでしょうか?) このような処理のテクニックなど御座いましたら ご教授くださいませ。 Iterator itreq = result.getrequest().iterator(); Iterator itres = result.getresponse().iterator(); while (itreq.hasNext()) { //リクエスト情報 RequestInfo req = (RequestInfo) (itreq.next()); ..... リクエスト情報の取り出し while (itres.hasNext()) { ResponseInfo res = (ResponseInfo) (itres.next()); レスポンス情報の取り出し String resResult = res.getResult(); TestIterator public class RequestInfo { private String id; private String ipAddress; private String name; /** * @return */ public String getId() { return id; } /** * @param string */ public void setId(String string) { id = string; } /** * @return */ public String getIpAddress() { return ipAddress; } /** * @return */ public String getName() { return name; } /** * @param string */ public void setIpAddress(String string) { ipAddress = string; } /** * @param string */ public void setName(String string) { name = string; } } public class ResponseInfo { private String result; /** * @return */ public String getResult() { return result; } /** * @param string */ public void setResult(String string) { result = string; } } public class ResultMessage { private List requestInfoList = new ArrayList(); private List responseInfoList = new ArrayList(); public void addRequest(RequestInfo reqInfo) { requestInfoList.add(reqInfo); } public void addResponse(ResponseInfo resInfo) { responseInfoList.add(resInfo); } public List getrequest() { return requestInfoList; } public List getresponse() { return responseInfoList; } } import java.util.Iterator; public class TestIterator { public static void main(String[] args) { RequestInfo reqInfo1 = new RequestInfo(); ResponseInfo resInfo1 = new ResponseInfo(); RequestInfo reqInfo2 = new RequestInfo(); ResponseInfo resInfo2 = new ResponseInfo(); //値設定 reqInfo1.setId("01"); reqInfo1.setIpAddress("192.168.0.1"); reqInfo1.setName("taro"); resInfo1.setResult("OK"); reqInfo2.setId("02"); reqInfo2.setIpAddress("192.168.0.2"); reqInfo2.setName("jiro"); resInfo2.setResult("NG"); ResultMessage result = new ResultMessage(); result.addRequest(reqInfo1); result.addRequest(reqInfo2); //値取得 Iterator itreq = result.getrequest().iterator(); Iterator itres = result.getresponse().iterator(); System.out.println("##########################"); // while (itreq.hasNext() && itres.hasNext()) { while (itreq.hasNext()) { //リクエスト情報 RequestInfo req = (RequestInfo) (itreq.next()); String id = req.getId(); System.out.println("id = " + id); String ipAddress = req.getIpAddress(); System.out.println("ipAddress = " + ipAddress); String name = req.getName(); System.out.println("name = " + name); /* //レスポンス情報 ResponseInfo res = (ResponseInfo) (itres.next()); String resResult = res.getResult(); System.out.println("resResult = " + resResult); System.out.println("-------------------------------"); */ } } } | ||||||||
|
投稿日時: 2004-08-31 16:49
iteratorの中でiteratorを回すのは、集合の積になるかと思います。いい方法ではないというより、全然別の演算です。 今回の要件でしたら、書かれているように、indexを用いてループを回すのがいいと思います。 [ メッセージ編集済み 編集者: 永井和彦 編集日時 2004-08-31 16:55 ] | ||||||||
|
投稿日時: 2004-08-31 16:59
unibon です。こんにちわ。
iterator がループカウンタになりますが、内側のループ用のカウンタは、外側のループが1回転するごとに作り直す必要があります。 iterator が内部でカウンターを new していることに注意する必要があります。
みたいな感じ。 | ||||||||
|
投稿日時: 2004-08-31 16:59
つかぬ事をうかがいますが、
は、あるのに、
が存在しないのは、原因と関係ありますでしょうか。 | ||||||||
|
投稿日時: 2004-08-31 23:32
皆様、アドバイスを頂き有り難う御座います。
>result.addResponse(resInfo1); >result.addResponse(resInfo2); >が存在しないのは、原因と関係ありますでしょうか。 ご指摘の通り、抜けておりましたので下記のように 追加致しました。 ただ、実行結果をみると reqInfo1 resInfo1 reqInfo2 resInfo2 の順番で値を取り出したいのですが、 reqInfo1 resInfo1 resInfo2 reqInfo2 resInfo1 resInfo2 となっております。(コードに記述されている通りの動きではありますが…) やはり、indexを用いて回すのがよさそうです。 import java.util.Iterator; public class TestIterator { public static void main(String[] args) { RequestInfo reqInfo1 = new RequestInfo(); ResponseInfo resInfo1 = new ResponseInfo(); RequestInfo reqInfo2 = new RequestInfo(); ResponseInfo resInfo2 = new ResponseInfo(); //値設定 reqInfo1.setId("01"); reqInfo1.setIpAddress("192.168.0.1"); reqInfo1.setName("taro"); resInfo1.setResult("OK"); reqInfo2.setId("02"); reqInfo2.setIpAddress("192.168.0.2"); reqInfo2.setName("jiro"); resInfo2.setResult("NG"); ResultMessage result = new ResultMessage(); result.addRequest(reqInfo1); result.addRequest(reqInfo2); result.addResponse(resInfo1); result.addResponse(resInfo2); //値取得 Iterator itreq = result.getrequest().iterator(); //Iterator itres = result.getresponse().iterator(); System.out.println("##########################"); // while (itreq.hasNext() && itres.hasNext()) { while (itreq.hasNext()) { //リクエスト情報 RequestInfo req = (RequestInfo) (itreq.next()); String id = req.getId(); System.out.println("id = " + id); String ipAddress = req.getIpAddress(); System.out.println("ipAddress = " + ipAddress); String name = req.getName(); System.out.println("name = " + name); Iterator itres = result.getresponse().iterator(); while (itres.hasNext()) { // ... // レスポンス情報 ResponseInfo res = (ResponseInfo) (itres.next()); String resResult = res.getResult(); System.out.println("resResult = " + resResult); System.out.println("-------------------------------"); } } } } | ||||||||
|
投稿日時: 2004-08-31 23:49
>今回の要件でしたら、書かれているように、
>indexを用いてループを回すのがいいと思います。 Iteratorで値を取り出す場合は、シーケンシャルなアクセスである、つまり、 リストに追加した順番に取り出すと認識しております(LinkedList等は除く) よって、indexを用いてループを回すというよりむしろ、順番に回すという のが私自身の認識です。 また、indexを用いてループを回したり、indexの番号の値を取り出すには Vectorでないとできないと考えております。 もし私が勘違いしている点や、Iteratorでindexを用いてループを回す 方法をご存知のかたがいらっしゃいましたら是非教えて下さい。 | ||||||||
|
投稿日時: 2004-09-01 00:14
indexで回すっていうのは上記のようなことではなかろうか? ただし、この場合reqList.size() <= resList.size()でないとExceptionが発生します。 | ||||||||
|
投稿日時: 2004-09-01 09:34
ろっぷすと申します。こんにちは。
今回のパターンではクラス構成を変えたのがいいのではないでしょうか? すくなくともResultMessageに格納されている RequestInfoとResponseInfoの2つのリストが同じ要素数でなければ ↓のような取り出し方はできないですよね reqInfo1 resInfo1 reqInfo2 resInfo2 ならば、ResultMessageにはRequestInfoとResponseInfoのリストではなく オブジェクトを格納し、ResultMessageをリストに格納した方がシンプル ではないでしょうか? | ||||||||
