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);
}
}
}
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()
.
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 .
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();
}
}
Java 8 a introduit Collection.removeIf () , ce qui vous permet de faire:
set.removeIf(s -> s.length() % 2 == 0)