Frage Iterieren über Sätze von Sets


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?

            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 demselben Setup (abzüglich 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);

5
2017-07-26 14:18


Ursprung


Antworten:


Ihre allAnimals Variable ist vom Typ Set<Set<String>>wenn du es fragst Iterator Sie "vergessen" die Typinformationen. Laut dem Compiler enthält Ihr Iterator nur Objects. Ändern Sie die Zeile, in der Sie die erhalten Iterator dazu

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

und alles sollte gut sein.


6
2017-07-26 14:22



Verwenden Sie eine erweiterte for-Schleife zum Durchlaufen der Mengen, ist einfacher als die Verwendung eines Iterators:

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

Um zum Beispiel alle Namen des Tieres zu durchlaufen:

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

4
2017-07-26 14:25



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


2
2017-07-26 14:28



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

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

1
2017-07-26 14:27