5 votes

Itération sur des ensembles d'ensembles

J'essaie d'écrire un programme qui itère sur un ensemble d'ensembles. Dans l'exemple de code ci-dessous, j'obtiens une erreur indiquant que iter.next() est de type objet plutôt qu'un ensemble de chaînes de caractères. J'ai également d'autres problèmes plus mystérieux avec l'itération sur des ensembles d'ensembles. Des suggestions ?

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

Une question connexe avec la même configuration (moins la boucle).
Le fragment de code ci-dessous produit un résultat final qui comprend des tildes. Mais je ne veux pas modifier allAnimals au fur et à mesure ! Comment puis-je modifier l'extension sans affecter l'ensemble plus large (allAnimals).

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

                System.out.println(allAnimals);

6voto

mthmulders Points 4590

Votre allAnimals est de type Set<Set<String>> Cependant, lorsque l'on demande à son Iterator vous "oubliez" l'information sur le type. Selon le compilateur, votre itérateur contient simplement Object s. Modifiez la ligne où vous obtenez le Iterator à cette

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

et tout devrait bien se passer.

4voto

Óscar López Points 97105

Utilisez une boucle for améliorée pour parcourir les ensembles, c'est plus facile que d'utiliser un itérateur :

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

Par exemple, pour parcourir tous les noms d'animaux :

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

2voto

rocketboy Points 5100

Vous ne mentionnez pas le type sur laquelle votre itérateur est défini. En ce qui le concerne, il s'attend donc à ce que le prochain objet soit un objet.

1voto

Bohemian Points 134107

J'utiliserais simplement une boucle foreach (imbriquée) :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X