- PR -

入れ子状Collectionの再帰的iterator

1
投稿者投稿内容
Jumpin'' Jack Flash
大ベテラン
会議室デビュー日: 2006/01/24
投稿数: 198
投稿日時: 2006-05-12 15:11
1.
Collectionの要素にCollectionオブジェクトを持つ
入れ子状のCollectionオブジェクトを作ります。
(サンプルはListを用いています)

2.
iterator()メソッドで
入れ子状のCollectionオブジェクトを再帰的に解析
します。

結果:
正しくループしません。
このような使い方は邪道なのでしょうか?

コード:
public class Test {
  
  public static void main(String[] args) throws Exception {
    // 1.
    List vector = new Vector();
    {
      List array = new ArrayList();
      array.add("a");
      array.add("b");
      vector.add(array);
    } {
      List linked = new LinkedList(); 
      linked.add("1");
      linked.add("2");
      vector.add(linked);
    }
    // 2.
    showElement(vector, 0);
  }

  private static void showElement(Object element, int indent) {
    // indent
    for (int i = 0; i < indent; i ++) System.out.print("\t");
    // element
    System.out.print(element);
    // childres
    if (element instanceof List) {
      Iterator i = ((List)element).iterator();
      System.out.println("|"+i);
      if (i.hasNext()) {
        showElement(i.next(), indent + 1);
      }
    } else {
      System.out.println();
    }
  }
  
}

結果:
[[a, b], [1, 2]]|java.util.AbstractList$Itr@f38798
	[a, b]|java.util.AbstractList$Itr@4b222f
		a



iteratorを使わず、インデックスでループすると
正しく動作します。

コード:
	private static void showElement2(Object element, int indent) {
		// indent
		for (int i = 0; i < indent; i ++) System.out.print("\t");
		
		// element
		System.out.print(element);
		
		// child
		if (element instanceof List) {
			List list = (List)element;
			System.out.println("|"+element.getClass());
			for (int i = 0; i < list.size(); i ++) {
				showElement2(list.get(i), indent + 1);
			}
		} else {
			System.out.println();
		}
	}

結果:
[[a, b], [1, 2]]|class java.util.Vector
	[a, b]|class java.util.ArrayList
		a
		b
	[1, 2]|class java.util.LinkedList
		1
		2



iteratorは、このような使い方をしてはいけない
のでしょうか?

回避策はございますか?
未記入
会議室デビュー日: 2006/03/28
投稿数: 18
お住まい・勤務地: 大阪
投稿日時: 2006-05-12 15:24
釣り?
もし釣りじゃないならAPIとかサンプル読んだ方がいいよ。

一応マジレスすると
if (i.hasNext()) {

while (i.hasNext()) {
にするだけで動く。
Jumpin'' Jack Flash
大ベテラン
会議室デビュー日: 2006/01/24
投稿数: 198
投稿日時: 2006-05-12 15:34
すいません。アホ丸出しでした。
意外とこういうのって、本人は気付かなかったり...
コードレビューってことで、ありがとうございました。
1

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