2013-07-26 37 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変数は、しかし、あなたはそのIteratorを依頼するときに型情報を「忘れる」、タイプSet<Set<String>>です。コンパイラによると、イテレータにはObjectが含まれています。 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 O言及していませんあなたのイテレータが定義されています。だからそれが懸念される限り、それは次のものとしてオブジェクトを期待する。