web-dev-qa-db-fra.com

Filtre ArrayList

Comment pouvez-vous filtrer quelque chose d'un Java ArrayList comme si vous aviez:

  1. Comment vas-tu
  2. Comment vas-tu
  3. Joe
  4. Mike

Et le filtre est "Comment" il va supprimer Joe et Mike.

37
kevc45

Le meilleur moyen est probablement d'utiliser Guava

List<String> list = new ArrayList<String>();
list.add("How are you");
list.add("How you doing");
list.add("Joe");
list.add("Mike");

Collection<String> filtered = Collections2.filter(list,
    Predicates.containsPattern("How"));
print(filtered);

empreintes

How are you
How you doing

Si vous souhaitez obtenir la collection filtrée sous forme de liste, vous pouvez utiliser ceci (également depuis Guava):

List<String> filteredList = Lists.newArrayList(Collections2.filter(
    list, Predicates.containsPattern("How")));
53
user219882

Dans Java-8 , ils ont introduit la méthode removeIf qui prend un Predicate en paramètre.

Donc ce sera facile comme:

List<String> list = new ArrayList<>(Arrays.asList("How are you",
                                                  "How you doing",
                                                  "Joe",
                                                  "Mike"));
list.removeIf(s -> !s.contains("How"));
56
Alexis C.

Parcourez la liste et vérifiez si contient votre chaîne "Comment" et si c'est le cas, supprimez-la. Vous pouvez utiliser le code suivant:

// need to construct a new ArrayList otherwise remove operation will not be supported
List<String> list = new ArrayList<String>(Arrays.asList(new String[] 
                                  {"How are you?", "How you doing?","Joe", "Mike"}));
System.out.println("List Before: " + list);
for (Iterator<String> it=list.iterator(); it.hasNext();) {
    if (!it.next().contains("How"))
        it.remove(); // NOTE: Iterator's remove method, not ArrayList's, is used.
}
System.out.println("List After: " + list);

OUTPUT:

List Before: [How are you?, How you doing?, Joe, Mike]
List After: [How are you?, How you doing?]
27
anubhava

écrivez vous-même une fonction de filtrage

 public List<T> filter(Predicate<T> criteria, List<T> list) {
        return list.stream().filter(criteria).collect(Collectors.<T>toList());
 }

Et puis utiliser

    list = new Test().filter(x -> x > 2, list);

C'est la version la plus soignée de Java, mais JDK 1.8 est nécessaire pour prendre en charge le calcul lambda.

7
MG.

Je suis d'accord avec une réponse précédente qui Google Guava aide probablement beaucoup ici, en termes de lisibilité:

final Iterables.removeIf(list, new Predicate<String>() {
    @Override
    public boolean apply(String input) {
        if(input.contains("How")) { //or more complex pattern matching
            return true;
        }
        return false;
    }
}); 

Veuillez noter qu’il s’agit en réalité d’un doublon de Goyave - Comment supprimer une liste, en se basant sur un prédicat, en gardant une trace de ce qui a été supprimé?

2
Savino Sguera