2 votes

Comment puis-je vider systématiquement un objet itérable au fur et à mesure que je le parcours ?

J'ai une méthode qui prend n'importe quel type d'objet itérable de type inconnu T, et boucle à travers lui en prenant les éléments de celui-ci et en le mettant dans une autre structure de données. I

J'ai essayé d'utiliser .clear() sur l'objet après avoir bouclé, mais il n'est pas garanti qu'il ait une méthode claire. Alors, comment puis-je supprimer des éléments au fur et à mesure que je passe par l'objet, ou peut-être créer un nouvel objet avec le même type exact mais sans valeurs, de sorte que je puisse tout rajouter à l'objet, en sachant seulement que l'objet est Iterable ?

public class PriorityQueue<K extends Comparable<? super K>,V> {

  public static <K> void PriorityQueueSort(Iterable<? extends K> list,
        PriorityQueue<? super K, ?> queue) {

      for (K item : list) {
          queue.insert(item, null);
      }

      list.clear();
  }
}

3voto

NPE Points 169956

Au lieu d'utiliser une boucle for-each, utilisez une boucle explicite Iterator et Iterator.remove() :

    Iterator<K> iter = list.iterator();
    while (iter.hasNext()) {
        K item = iter.next();
        queue.insert(item, null);
        iter.remove();
    }

Gardez à l'esprit que toutes les Iterator supporte la suppression des objets (par exemple, les collections en lecture seule ne le font pas).

1voto

FrVaBe Points 14559

Vous devez utiliser un Itérateur pour parcourir votre liste. L'itérateur supporte une méthode de suppression.

1voto

Andreas_D Points 64111

Toutes les collections sont des Iterables mais l'inverse n'est pas vrai. Vous ne pouvez donc pas vous attendre à ce que le fait de retirer quelque chose des sources de données qui produisent les éléments de l'itérateur ait toujours un sens. Comme dans cet exemple assez compliqué de Hello World :

Iterable<Character> myIterable = new Iterable<Character>() {

    @Override
    public Iterator<Character> iterator() {
        Iterator<Character> it = new Iterator<Character>() {

            private String hello = "Hello World";
            private int counter = 0;

            @Override
            public boolean hasNext() {
                return counter < hello.length();
            }

            @Override
            public Character next() {
                return hello.charAt(counter++);
            }

            @Override
            public void remove() {
                throw new UnsupportedOperationException();
            }

        };
        return it;
    }
};

for (Character c : myIterable) {
    System.out.print(c);
}

Il n'y a pas de collection derrière l'Iterable. Il s'agit simplement d'un "fournisseur d'itérateurs" et même celui-ci n'a qu'une chaîne (et nous ne pouvons pas supprimer les caractères d'une chaîne, une chaîne est immuable).

Donc non, vous ne pouvez pas "effacer n'importe quel itérable" et tous les itérateurs ne permettent pas de supprimer des éléments.

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