迭代集合中的集合

5

我正在尝试编写一个程序,遍历一组集合。在下面的示例代码中,我收到了一个错误,指出iter.next()的类型是对象而不是一组字符串。我也遇到了一些更神秘的问题,遍历集合的集合。有什么建议吗?

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

一个类似但不包括循环的相关问题。
下面的代码片段导致最终输出包含波浪号。但是我不想在操作 allAnimals 集合时进行更改!如何编辑 extension 而不影响更大的集合(allAnimals)。

 for (Set<String> extension : allAnimals) 
                {
                    System.out.println("Set size: " + extension.size());
                    extension.add("~");     
                    System.out.println(extension);
                }   

                System.out.println(allAnimals);

3
创建集合后不需要立即调用 someSet.clear(); - Sergey Kalinichenko
谢谢!我有时会过度初始化变量,因为我很紧张。 - user2623054
4个回答

6

您的allAnimals变量的类型是Set<Set<String>>,但是当您询问其Iterator时,您“忘记”了类型信息。根据编译器,您的迭代器只包含Objects。将获取Iterator的行更改为以下内容:

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

并且一切都应该没问题。

4
使用增强型for循环遍历集合比使用迭代器更容易:
for (Set<String> names : allAnimals) {
    System.out.println(names.size());
}

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

1
@user2623054 这是很好的建议,我推荐你遵循它。不过,我还建议将 mthmulders 的答案标记为被接受的答案,因为它准确地确定了问题所在。 - James Dunn
这个方法似乎导致了一个新的错误:"只能迭代数组或java.lang.Iterable实例"。 - user2623054
“Set”是“Iterable”的一个实例。你一定做错了什么,因为上面的代码是有效的,而且这也是现在推荐的迭代方式。 - Óscar López

2

您没有提及迭代器定义的类型。因此,它期望下一个对象。


1
我会直接使用(嵌套的)foreach循环:
for(Set<String> animals : allAnimals) {
    int size = animals.size(); // if you want it
    for (String animal : animals) {
        // do something with the name
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接