0

我创建了一个集合并用集合元素填充它,但是当我尝试使用构造(或其他方法)遍历这个容器时,foreach它什么也没有返回,我试图获取 size() 并看到了我的期望(适当的数字)但似乎每个集合内的容器不为空是空的

代码片段示例:

Item it1, it2;
List<Collection<Item>> hull = new ArrayList<Collection<Item>>();
List<Item> seq = new ArrayList<Item>();
seq.add(it1);
hull.add(seq);
seq.clear();
seq.add(it2);
hull.add(seq);
for (<Collection<Item> c: hull)
      System.out.println(c);

这只是我所做的一个简化片段请提出替代方案。我在哪里做错了?

4

3 回答 3

4

每次你打电话给seq.clear()你清空内部的 ArrayList。不要忘记,当您将对象添加到 Collection 时,您只添加了引用。你不克隆对象。您应该在每次迭代时创建一个新的 ArrayList 对象。

例如

List<Collection<Item>> hull = new ArrayList<Collection<Item>>();
List<Item> seq = new ArrayList<Item>();
seq.add(it1);
hull.add(seq);
List<Item> seq2 = new ArrayList<Item>();
seq2.add(it2)
hull.add(seq2);

编辑:

编译的完整示例:

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

public class NewClass1 {

    static class Item {

        String a;

        public Item(String a) {
            this.a = a;
        }
        @Override
        public String toString() {
            return a;
        }
    }

    public static void main(String[] args) {
        List<Collection<Item>> hull = new ArrayList<Collection<Item>>();
        List<Item> seq = new ArrayList<Item>();
        Item it1 = new Item("item 1");
        seq.add(it1);
        hull.add(seq);
        List<Item> seq2 = new ArrayList<Item>();
        Item it2 = new Item("item 2");
        seq2.add(it2);
        hull.add(seq2);

        for (Collection<Item> current : hull) {
            for (Item item : current) {
                System.out.println(item);
            }
        }
    }
}

输出:

run:
item 1
item 2
于 2013-03-07T21:14:42.150 回答
2

您的代码,更正为编译:

package sample;

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

public class Item {
   public static void main( String[] args ) {
      List< List< Item >> hull = new ArrayList<>();
      List< Item >        seq = new ArrayList<>();
      seq.add( new Item());
      hull.add( seq );
      seq = new ArrayList<>(); // in place of seq.clear();
      seq.add( new Item());
      hull.add( seq );
      for( List<Item> c: hull ) {
         System.out.println( c.get( 0 ));
      }
   }
}

输出:

sample.Item@6da264f1
sample.Item@40914272

如您所见,没有问题。

于 2013-03-07T21:21:31.303 回答
0

为了遍历集合的集合,您需要一个嵌套的 foreach。

    for(Collection<Item> c: hull)
    {
        for(Item i: c)
        {

        }
    }

顺便说一句,您是否知道 it1 和 it2 未初始化,这就是为什么您什么也没得到?

size() 将始终为您提供集合的大小,但它们可能包含空值(就像您的情况一样)。

于 2013-03-07T21:18:01.080 回答