- PR -

iteratorの中で、iteratorで回す方法

投稿者投稿内容
Edosson
ぬし
会議室デビュー日: 2004/04/30
投稿数: 675
投稿日時: 2004-09-01 09:54
引用:


>result.addResponse(resInfo1);
>result.addResponse(resInfo2);
>が存在しないのは、原因と関係ありますでしょうか。

ご指摘の通り、抜けておりましたので下記のように
追加致しました。


抜けてたのが補完されたなら、ループは最初に投稿された
アルゴリズムのままだったら、それで、当初の期待通りの動作を
するのではないでしょうか。
(なぜ、ループのアルゴリズムまで入れ替えられてしまったのか、わかんないんですが)

あと、ろっぷす様はじめ、他の方々が指摘されているとおり、
reqInfoとresInfoに、コードで拘束できていない依存関係がありますね。
こんな風にできた方がいいんじゃないでしょうか。
コード:
ResultMessage result = new ResultMessage();
result.add(resInfo1, reqInfo1);
result.add(resInfo2, reqInfo2);

Iterator it = result.iteretor();
while(it.hasNext()){
    MyEntry entry = (MyEntry)it.next();
    RequestInfo req = entry.getRequest();
    ResponseInfo res = entry.getResponse();

................

}


entryはクラスじゃなくても、2項の配列でもいいし。
永井和彦
ぬし
会議室デビュー日: 2002/07/03
投稿数: 276
お住まい・勤務地: 東京都
投稿日時: 2004-09-01 12:29
永井です。
手抜きで短く書いたら混乱を招いてしまったようなので、今回はもうちょっと丁寧に書きます。

引用:

>今回の要件でしたら、書かれているように、
>indexを用いてループを回すのがいいと思います。

Iteratorで値を取り出す場合は、シーケンシャルなアクセスである、つまり、
リストに追加した順番に取り出すと認識しております(LinkedList等は除く)
よって、indexを用いてループを回すというよりむしろ、順番に回すという
のが私自身の認識です。



まずIteratorに関してですが。
「何らかの走査基準にしたがってCollection内の全ての要素を一回ずつ取り出すためのインターフェース」というのが私の認識です。
どんな順番で取り出すかは各Iteratorの実装次第と考えています。
……と、いきなり本筋から外れてしまいました。

さて、前の投稿で私が書いた「indexで回す」の意味ですが、ちょま吉さんがコード例を書かれている通りの意図です。
最初にbanbooさんが投稿された内容なんですが「Listで扱ってる」「A[1], B[1], A[2], B[2] ...の順でアクセスしたい」と解釈しましたので、それを簡単に実現する方法ということでちょま吉さんのコードと同様なものを念頭に置いて回答させていただきました。

きちんと直すのでしたら、ろっぷすさん、Edossonさんが指摘されている通り、データ構造の見直しを行うことが望ましいです。
banboo
大ベテラン
会議室デビュー日: 2003/12/05
投稿数: 210
投稿日時: 2004-09-01 12:54
>あと、ろっぷす様はじめ、他の方々が指摘されているとおり、
>reqInfoとresInfoに、コードで拘束できていない依存関係がありますね。
>こんな風にできた方がいいんじゃないでしょうか。

ResultMessage result = new ResultMessage();
result.add(resInfo1, reqInfo1);
result.add(resInfo2, reqInfo2);

Iterator it = result.iteretor();
while(it.hasNext()){
MyEntry entry = (MyEntry)it.next();
RequestInfo req = entry.getRequest();
ResponseInfo res = entry.getResponse();

................

}

たくさんのアドバイスを有難う御座いました。
上記のコードが私の行おうとしている事を実現する
アルゴリズムに近いので是非参考にさせて頂きます。
banboo
大ベテラン
会議室デビュー日: 2003/12/05
投稿数: 210
投稿日時: 2004-09-01 14:40
>ResultMessageにはRequestInfoとResponseInfoのリストではなく
>オブジェクトを格納し、ResultMessageをリストに格納した方がシンプル
>ではないでしょうか?

皆様に頂いたアドバイスを自分なりに解釈し、クラスのデータ構造を
見直しました。最終的なコードは以下になります。

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class TestIterator5 {


private static List ResultMsgList = new ArrayList();

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 result1 = new ResultMessage();

ResultMessage result2 = new ResultMessage();

result1.add(reqInfo1, resInfo1);
result2.add(reqInfo2, resInfo2);

ResultMsgList.add(result1);
ResultMsgList.add(result2);

Iterator it = ResultMsgList.iterator();

while (it.hasNext()) {
ResultMessage entry = (ResultMessage) it.next();

RequestInfo req = entry.getRequest();
ResponseInfo res = entry.getResponse();

//値取得
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);

String resResult = res.getResult();

System.out.println("resResult = " + resResult);

System.out.println("-------------------------------");
}

}

}

public class ResultMessage {

private RequestInfo reqInfo = new RequestInfo();

private ResponseInfo resInfo = new ResponseInfo();

public void add(RequestInfo req, ResponseInfo res) {

reqInfo = req;

resInfo = res;
}

/**
* @return
*/
public RequestInfo getRequest() {
// TODO 自動生成されたメソッド・スタブ
return reqInfo;
}

/**
* @return
*/
public ResponseInfo getResponse() {
// TODO 自動生成されたメソッド・スタブ
return resInfo;
}

}

public class ResponseInfo {

private String result;

/**
* @return
*/
public String getResult() {
return result;
}

/**
* @param string
*/
public void setResult(String string) {
result = string;
}

}

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;
}

}

スキルアップ/キャリアアップ(JOB@IT)