2013-07-26 15 views
5

Ich versuche, ein Programm zu schreiben, das über eine Reihe von Sätzen iteriert. Im folgenden Beispielcode erhalte ich einen Fehler, der besagt, dass iter.next() vom Typ object und nicht von einer Menge von Strings ist. Ich habe noch andere mysteriösere Probleme mit der Wiederholung von Sets. Irgendwelche Vorschläge?Iterieren über Sätze von Sets

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

Eine verwandte Frage mit dem gleichen Aufbau (minus der Schleife).
Das folgende Codefragment führt zu einer endgültigen Ausgabe, die Tilden enthält. Aber ich möchte nicht alle Tiere ändern, während ich gehe! Wie kann ich die Erweiterung bearbeiten, ohne den größeren Satz (allAnimals) zu beeinflussen?

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

       System.out.println(allAnimals); 
+3

Sie müssen 'someSet.clear(); nicht direkt nach dem Erstellen eines Sets aufrufen. – dasblinkenlight

+0

Danke! Ich bin nervös, weil ich keine Variablen initiiere, also bin ich manchmal über Bord gegangen. – user2623054

Antwort

6

Ihre allAnimals Variable ist vom Typ Set<Set<String>> jedoch, wenn man seine Iterator fragen Sie „vergessen“ die Typinformationen. Laut dem Compiler enthält Ihr Iterator nur Object s. Ändern Sie die Zeile, wo Sie die Iterator dieser

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

erhalten und es sollte alles in Ordnung sein.

+0

Danke, das hat den Fehler behoben. – user2623054

4

Verwenden Sie eine for-Schleife verbessert die Sätze zum Verfahren ist einfacher als ein Iterator:

for (Set<String> names : allAnimals) { 
    System.out.println(names.size()); 
} 

Zum Beispiel alle Namen des Tieres zu durchqueren:

for (Set<String> names : allAnimals) { 
    for (String name : names) { 
     System.out.println(name); 
    } 
} 
+1

@ user2623054 Dies ist ein guter Rat, ich empfehle es zu folgen. Ich würde jedoch auch empfehlen, die Antwort von mthmulders als die akzeptierte zu markieren, da sie das Problem genau identifiziert. –

+0

Diese Methode scheint zu einem neuen Fehler zu führen: "Kann nur über ein Array oder eine Instanz von java.lang.Iterable iterieren" – user2623054

+0

'Set' ist eine Instanz von' Iterable'. Sie müssen etwas falsch machen, weil das obige funktioniert, und es ist die empfohlene Methode, um heutzutage zu iterieren. –

1

Ich würde nur verwenden (verschachtelte) foreach-Schleife:

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

Sie erwähnen nicht die type o n, deren Iterator definiert ist. So weit es geht, erwartet es ein Objekt als nächstes.