- 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は、このような使い方をしてはいけない
のでしょうか?
回避策はございますか?
|