Java 集合-清除()

Java 集合-清除(),java,collections,iterator,Java,Collections,Iterator,我创建了一个集合,并用集合中的元素填充它,但当我尝试使用foreach构造(或其他方法)遍历此容器时,它什么也不返回,我尝试获取size(),并看到了我期望的结果(适当的数字)但似乎每个集合中不为空的容器都是空的 代码片段示例: Item it1, it2; List<Collection<Item>> hull = new ArrayList<Collection<Item>>(); List<Item> seq = new Arra

我创建了一个集合,并用集合中的元素填充它,但当我尝试使用
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);
项目it1、it2;
列表外壳=新的ArrayList();
List seq=新的ArrayList();
以下新增内容(it1);
船体。添加(序号);
seq.clear();
新增(it2);
船体。添加(序号);

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

例如


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

例如


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

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

        }
    }
for(集合c:外壳)
{
关于(项目i:c)
{
}
}
顺便问一下,您是否知道it1和it2没有初始化,这就是为什么您什么都没有得到


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

为了迭代集合,您需要一个嵌套的foreach

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

        }
    }
for(集合c:外壳)
{
关于(项目i:c)
{
}
}
顺便问一下,您是否知道it1和it2没有初始化,这就是为什么您什么都没有得到


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

您的代码已更正为编译:

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

如您所见,没有问题。

您的代码已更正为编译:

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


正如您所见,没有问题。

听起来不错,需要检查)@zest您得到了什么输出?你能发布一个完整的最小程序,这样我们就可以重现这个行为吗?非常感谢,创建新集合的每一步帮助七清除,列表被添加到列表中,所以第一个参数是错误的实际上是正确的将重用列表seq而不是创建seq2Sounds很棒,需要检查)@zest你得到了什么输出?你能发布一个完整的最小程序,这样我们就可以重现这个行为吗?非常感谢,创建新集合的每一步都会清除,一个列表被添加到列表中,所以第一个参数是错误的,实际上正确的将是重用list seq而不是creation Seq2。该代码不会编译。它缺少
get(0)
未在
集合中定义,
用于(OMG,这不是用于编译的代码,只是一个示例。我很高兴它至少为我提供了hashcode。谢谢大家,我得到了它。此代码未编译。它缺少
get(0)
未在
集合中定义,
(天哪,这不是用于编译的代码,只是一个示例。我很高兴至少能为我翻出hashcode谢谢大家,我得到了itList>hull=new ArrayList();我不知道这么短的声明集合的方式,我的示例不只是用于编译抽象,很抱歉那个列表>hull=new ArrayList();我不知道这么短的声明集合的方法,我的示例不只是用于编译抽象,对此表示抱歉
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