web-dev-qa-db-fra.com

Supprimer l'élément du set

J'essaie de supprimer toutes les chaînes qui sont de même longueur dans un ensemble. Voici mon code jusqu'à présent, mais j'ai du mal à obtenir l'index de l'itérateur dans la boucle améliorée.

public static void removeEvenLength(Set<String> list) {
    for (String s : list) {
        if (s.length() % 2 == 0) {
            list.remove(s);
        }
    }
}
7
f3d0r

Un Set n'a pas la notion d'index d'un élément. Les éléments n'ont pas d'ordre dans l'ensemble. De plus, vous devriez utiliser Iterator lors de l'itération pour éviter un ConcurrentModificationException lors de la suppression d'un élément d'une collection while en boucle dessus:

for (Iterator<String> iterator = list.iterator(); iterator.hasNext();) {
    String s =  iterator.next();
    if (s.length() % 2 == 0) {
        iterator.remove();
    }       
}

Notez l'appel à Iterator.remove() au lieu de Set.remove().

19
manouti

Je pensais juste que je publierais une solution Java 8 qui pourrait aider quelqu'un à l'avenir. Java 8 Streams propose un ensemble de méthodes Nice telles que filter et collect. La méthode filter élimine simplement les éléments du flux qui doivent être transmis à l'étape suivante. La méthode collect combine des éléments en une Collection d'une sorte ou une Map

// The data to filter
final Set<String> strings = 
        new HashSet<>(Arrays.asList("a", "ab", "abc", "abcd"));

// Now, stream it!
final Set<String> odds =
        strings.stream()
               .filter(s -> s.length() % 2 != 0) // keep the odds
               .collect(Collectors.toSet());     // collect to a new set

Cela ne modifie pas réellement la collection d'origine, mais crée une nouvelle Set contenant les objets String de longueur impaire.

Pour en savoir plus sur Java 8 Streams, consultez ce excellent tutoriel d’Oracle ou le super JavaDocs .

6
wassgren

Vous n'avez pas besoin de l'index. Mais vous avez besoin de la variable explicite Iterator. L'itérateur a la méthode remove() , aucun paramètre, qui supprime l'élément en cours de la collection.

Iterator<String> itr = list.iterator();  // list is a Set<String>!
while (itr.hasNext())
{
    String s = itr.next();
    if (s.length() % 2 == 0) {
        itr.remove();
    }
}
3
rgettman

Java 8 a introduit Collection.removeIf () , ce qui vous permet de faire:

set.removeIf(s -> s.length() % 2 == 0)
1
Leonardo Lima