2013-07-26 63 views
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)。

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();'。 – dasblinkenlight

+0

謝謝!我很擔心不會啓動變量,所以我有時候會過度。 – user2623054

回答

6

allAnimals變量是Set<Set<String>>型的,但是,當你問其Iterator你「忘記」類型的信息。根據編譯器,您的迭代器只包含Object s。更改線路你在哪裏得到的Iterator這個

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

,所有應罰款。

+0

謝謝,修正了錯誤。 – user2623054

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答案標記爲已接受的答案,因爲它能夠準確識別問題。 –

+0

此方法似乎導致了一個新錯誤:「只能遍歷數組或java.lang.Iterable的實例」 – user2623054

+0

Set是Iterable的一個實例。你必須做錯了什麼,因爲上述工作,並且這是現在迭代的推薦方式。 –

1

我只想用一個(嵌套)的foreach循環:

for(Set<String> animals : allAnimals) { 
    int size = animals.size(); // if you want it 
    for (String animal : animals) { 
     // do something with the name 
    } 
} 
2

你不提的typeØ n你的迭代器被定義。所以就它而言,它期望下一個對象。