收藏 - 清除()

时间:2013-03-07 21:11:42

标签: java collections iterator

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

代码段示例:

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

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

3 个答案:

答案 0 :(得分:4)

每次调用seq.clear()时,都会清空内部ArrayList。不要忘记,当您向Collection添加对象时,只需添加引用。您不克隆对象。您应该在每次迭代时创建一个新的ArrayList对象。

E.g。

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

答案 1 :(得分: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 ));
      }
   }
}

OUPUTS:

sample.Item@6da264f1
sample.Item@40914272

如您所见,没有问题。

答案 2 :(得分:0)

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

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

        }
    }

顺便说一下,你是否知道it1和it2没有被初始化,这就是为什么你什么都没得到的?

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