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 !如何在不影响更大集合 (allAnimals) 的情况下编辑扩展。

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

                System.out.println(allAnimals);
4

4 回答 4

6

您的allAnimals变量是 type Set<Set<String>>,但是,当您询问它时,Iterator您会“忘记”类型信息。根据编译器,您的迭代器只包含Objects。将获得的行更改Iterator为此

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

一切都应该没问题。

于 2013-07-26T14:22:18.883 回答
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);
    }
}
于 2013-07-26T14:25:54.790 回答
2

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

于 2013-07-26T14:28:48.507 回答
1

我只会使用(嵌套的)foreach 循环:

for(Set<String> animals : allAnimals) {
    int size = animals.size(); // if you want it
    for (String animal : animals) {
        // do something with the name
    }
}
于 2013-07-26T14:27:09.300 回答