- PR -

iteratorの中で、iteratorで回す方法

投稿者投稿内容
banboo
大ベテラン
会議室デビュー日: 2003/12/05
投稿数: 210
投稿日時: 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("-------------------------------");
*/

}

}

}
永井和彦
ぬし
会議室デビュー日: 2002/07/03
投稿数: 276
お住まい・勤務地: 東京都
投稿日時: 2004-08-31 16:49
引用:

(二つのリストを同時に処理するときは
iteratorの中で、iteratorを回す事自体があまりいい方法では
ないのでしょうか?indexを用いてループを回した方がいいのでしょうか?)



iteratorの中でiteratorを回すのは、集合の積になるかと思います。いい方法ではないというより、全然別の演算です。
今回の要件でしたら、書かれているように、indexを用いてループを回すのがいいと思います。

[ メッセージ編集済み 編集者: 永井和彦 編集日時 2004-08-31 16:55 ]
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2004-08-31 16:59
unibon です。こんにちわ。

iterator がループカウンタになりますが、内側のループ用のカウンタは、外側のループが1回転するごとに作り直す必要があります。
iterator が内部でカウンターを new していることに注意する必要があります。
コード:
Iterator itreq = result.getrequest().iterator(); 
while (itreq.hasNext()) { 
    Iterator itres = result.getresponse().iterator(); 
    while (itres.hasNext()) {
        // ...
    }
}


みたいな感じ。
Edosson
ぬし
会議室デビュー日: 2004/04/30
投稿数: 675
投稿日時: 2004-08-31 16:59
つかぬ事をうかがいますが、

引用:

result.addRequest(reqInfo1);
result.addRequest(reqInfo2);



は、あるのに、

引用:

result.addResponse(resInfo1);
result.addResponse(resInfo2);



が存在しないのは、原因と関係ありますでしょうか。
banboo
大ベテラン
会議室デビュー日: 2003/12/05
投稿数: 210
投稿日時: 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("-------------------------------");
}


}

}

}



banboo
大ベテラン
会議室デビュー日: 2003/12/05
投稿数: 210
投稿日時: 2004-08-31 23:49
>今回の要件でしたら、書かれているように、
>indexを用いてループを回すのがいいと思います。

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

また、indexを用いてループを回したり、indexの番号の値を取り出すには
Vectorでないとできないと考えております。

もし私が勘違いしている点や、Iteratorでindexを用いてループを回す
方法をご存知のかたがいらっしゃいましたら是非教えて下さい。
ちょま吉
大ベテラン
会議室デビュー日: 2004/08/04
投稿数: 112
投稿日時: 2004-09-01 00:14
コード:
List reqList = result.getrequest();
List resList = result.getresponse();
int size = reqList.size();
for (int i = 0; i < size; i++) {
    RequestInfo req = (RequestInfo)reqList.get(i);
    ResponseInfo res = (ResponseInfo)resList.get(i);
    .....................
}


indexで回すっていうのは上記のようなことではなかろうか?
ただし、この場合reqList.size() <= resList.size()でないとExceptionが発生します。
ろっぷす
会議室デビュー日: 2004/07/27
投稿数: 8
投稿日時: 2004-09-01 09:34
ろっぷすと申します。こんにちは。

今回のパターンではクラス構成を変えたのがいいのではないでしょうか?
すくなくともResultMessageに格納されている
RequestInfoとResponseInfoの2つのリストが同じ要素数でなければ
↓のような取り出し方はできないですよね
reqInfo1
resInfo1

reqInfo2
resInfo2

ならば、ResultMessageにはRequestInfoとResponseInfoのリストではなく
オブジェクトを格納し、ResultMessageをリストに格納した方がシンプル
ではないでしょうか?


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