2012-02-05 16 views
29

Come è possibile filtrare qualcosa da un ArrayList di Java come se si dispone di:ArrayList filtro

  1. Come stai
  2. Come va
  3. Joe
  4. Mike

E il filtro è "Come" rimuoverà Joe e Mike.

+4

Questo potrebbe aiutare http: // StackOverflow.it/questions/122105/java-what-is-the-best-way-to-filter-a-collection –

+0

La soluzione migliore sarebbe utilizzare un'altra struttura di raccolta dati invece di un arraylist: http://code.google. com/p/google-collections/ –

risposta

48

Probabilmente il modo migliore è quello di utilizzare 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); 

stampe

How are you 
How you doing 

Nel caso in cui si desidera ottenere la raccolta filtrato come una lista, è possibile utilizzare questo (anche da Guava):

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

Qual è il 2 in Collections2? –

+0

@ DavoudTaghawi-Nejad Probabilmente è perché esiste già la classe 'Collections' in Java standard. Quindi è chiaro quale classe è quella e non è necessario utilizzare un nome completo per distinguerli nel caso in cui vengano utilizzati in una classe. – user219882

+0

il suo errore di assegnazione su Predicati come Predicato non può essere risolto in Android .. – karan421

-9

Dato che non ci hai fornito molte informazioni, suppongo che la lingua in cui scrivi il codice sia C#. Prima di tutto: Preferisci System.Collections.Generic.List su ArrayList. In secondo luogo: un modo sarebbe quello di scorrere tutti gli elementi nell'elenco e controllare se contiene "come". Un altro modo sarebbe usare LINQ. Ecco un rapido esempio che filtra ogni elemento che non contiene "Come":

var list = new List<string>(); 
list.AddRange(new string[] { 
    "How are you?", 
    "How you doing?", 
    "Joe", 
    "Mike", }); 

foreach (string str in list.Where(s => s.Contains("How"))) 
{ 
    Console.WriteLine(str); 
} 
Console.ReadLine(); 
+1

"Dato che non ci hai dato molte informazioni", ma ci sono le tue informazioni, il post è stato taggato su Java. –

+1

@NeonWarge controlla la cronologia di modifica ... http://stackoverflow.com/posts/9146224/revisions Il tag "Java" è stato aggiunto più tardi dopo questa risposta. –

22

scorrere l'elenco e verificare se contiene la stringa "come" e se lo fa quindi rimuovere. È possibile utilizzare il codice seguente:

// 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); 

USCITA:

List Before: [How are you?, How you doing?, Joe, Mike] 
List After: [How are you?, How you doing?] 
+0

Che cosa restituisce la prima volta che viene restituito? – ArtOfWarfare

+1

Chiamare 'it.next()' la prima volta restituisce il primo elemento dalla collezione (lista). – anubhava

+1

Mi piace questo dato che è il più semplice senza coinvolgere librerie di terze parti. – Christopher

2

Sono d'accordo con una risposta precedente che Google Guava è probabilmente aiutando molto qui, leggibilità-saggio:

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

prega di notare che questo è fondamentalmente un duplicato di Guava - How to remove from a list, based on a predicate, keeping track of what was removed?

5

scrivere il vostro sé una funzione di filtro

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

e quindi utilizzare

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

Questa è la versione più pulito in Java, ma ha bisogno di JDK 1.8 per supportare lambda calcolo

43

In , hanno introdotto il metodo removeIf che prende un Predicate come parametro.

Così sarà facile come:

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