我创建了一个集合,并用元素也填充它们,但是当我尝试使用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);
这只是我所做的简化片段 请提出替代方案。我在哪里弄错了?
答案 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()将始终为您提供集合的大小,但它们可能包含空值(因为它是您的情况)。