Java 在集合集合上迭代

Java 在集合集合上迭代,java,iterator,set,Java,Iterator,Set,我试图编写一个程序,在一组集合上进行迭代。在下面的示例代码中,我得到一个错误,指出iter.next()是object类型,而不是字符串集。我还有一些关于迭代集合的更神秘的问题。有什么建议吗 Set<String> dogs= new HashSet<String>(); dogs.add("Irish Setter"); dogs.add("Poodle"); dogs.ad

我试图编写一个程序,在一组集合上进行迭代。在下面的示例代码中,我得到一个错误,指出iter.next()是object类型,而不是字符串集。我还有一些关于迭代集合的更神秘的问题。有什么建议吗

            Set<String> dogs= new HashSet<String>();
            dogs.add("Irish Setter");
            dogs.add("Poodle");
            dogs.add("Pug");
            dogs.add("Beagle");

            Set<String> cats = new HashSet<String>();
            cats.add("Himalayan");
            cats.add("Persian");

            Set<Set<String>> allAnimals = new HashSet<Set<String>>();                   
            allAnimals.add(cats);
            allAnimals.add(dogs);

            Iterator iter = allAnimals.iterator();            
            System.out.println(allAnimals.size());

            while (iter.hasNext()) 
            {
                System.out.println(iter.next().size());
            }   
Set dogs=newhashset();
添加(“爱尔兰塞特犬”);
添加(“贵宾犬”);
加上“哈巴狗”;
加上(“比格犬”);
Set cats=newhashset();
加上(“喜马拉雅”);
加上(“波斯语”);
Set allAnimals=new HashSet();
所有动物。添加(猫);
所有动物。添加(狗);
迭代器iter=allAnimals.Iterator();
System.out.println(allAnimals.size());
while(iter.hasNext())
{
System.out.println(iter.next().size());
}   

具有相同设置的相关问题(减去循环)。
下面的代码片段将生成最终输出,其中包括波浪形块。但我不想改变所有的动物!如何编辑扩展而不影响较大的集合(所有动物)

for(集合扩展名:allAnimals)
{
System.out.println(“设置大小:+extension.size());
扩展名。添加(“~”);
System.out.println(扩展);
}   
系统输出打印(所有动物);

您的
allAnimals
变量属于
Set
类型,但是,当您询问其
迭代器时,您“忘记”了类型信息。根据编译器,迭代器只包含
对象
s。将获取迭代器的
行更改为

Iterator<Set<String>> iter = allAnimals.iterator();
Iterator iter=allAnimals.Iterator();

所有这些都应该很好。

使用增强的for循环遍历集合,比使用迭代器更容易:

for (Set<String> names : allAnimals) {
    System.out.println(names.size());
}
for(集合名称:allAnimals){
System.out.println(names.size());
}
例如,要遍历所有动物的名称:

for (Set<String> names : allAnimals) {
    for (String name : names) {
        System.out.println(name);
    }
}
for(集合名称:allAnimals){
for(字符串名称:名称){
System.out.println(名称);
}
}
我只会使用一个(嵌套的)foreach循环:

for(Set<String> animals : allAnimals) {
    int size = animals.size(); // if you want it
    for (String animal : animals) {
        // do something with the name
    }
}
for(集合动物:所有动物){
int size=anives.size();//如果需要
用于(字符串动物:动物){
//用这个名字做点什么
}
}

您没有提到定义迭代器的
类型。因此,就它而言,它期望一个对象作为下一个对象。

您不需要调用
someSet.clear()创建集合后立即执行。谢谢!我对不启动变量感到紧张,所以有时会过火。@user2623054这是个好建议,我建议遵循它。但是,我还建议将mthmulders answer标记为已接受的答案,因为它可以准确地识别问题。此方法似乎会导致一个新错误:“只能迭代数组或java.lang.Iterable的实例”
Set
Iterable
的实例。你一定是做错了什么,因为上面的方法是有效的,这是目前推荐的迭代方法。
for(Set<String> animals : allAnimals) {
    int size = animals.size(); // if you want it
    for (String animal : animals) {
        // do something with the name
    }
}