2010-11-18 18 views

Antwort

13

Wenn Sie bereits die Guava-Bibliothek von Google verwenden, gibt es eine Collections2.filter()-Methode, die nur die Elemente aus einer Sammlung zurückgibt, die mit einer gegebenen Predicate übereinstimmen.

Ob dies jedoch Ihre Frage beantwortet, hängt davon ab, wie motiviert Sie ist, Schleifen zu vermeiden. Da Java-Sammlungen diese Funktionalität nicht integriert haben, ist die nur Weg, es zu tun, iterieren über alle Elemente auf einer bestimmten Ebene. Guava macht das intern, aber es macht immer noch die gleiche Schleife, die Sie manuell machen würden, nur in einer schöneren API.

1

Sie können Collections Methoden von Apache Commons Bibliothek verwenden. Aber diese Methoden machen nur die Schleife für Sie. Sie können es nicht wirklich vermeiden, wenn Sie versuchen, das zu tun, was Sie brauchen.

1

Es gibt funktionale wie Alternativen, die Ihren Code einfacher und einfacher zu verstehen machen, aber intern müssen sie möglicherweise durch die Liste iterieren. Aber sie Lazily führen die Filterung, die gut ist, wenn es Chancen gibt, dass der Client dies nicht immer verwendet.

Überprüfen Sie, ob der Filter (...) Methode für Sie richtig ist: Iterables.filter(Iterable, Predicate)

+0

I korrigiert und formatiert den (unterbrochenen) Link.Javadoc-Methodenverknüpfungen enthalten Zeichen, die maskiert werden müssen. Google Collections ist jetzt ein Teil von Guava. –

0

Auf einer bestimmten Ebene Looping wird unweigerlich beteiligt sein.

Wenn beide Datenstrukturen Listen sind, dann sind die Kosten proportional zum PRODUKT der Längen der beiden Listen. Das kann sehr teuer werden, wenn die Listen groß sind.

Um dies zu vermeiden, müssen eine oder beide Listen durch eine Datenstruktur dargestellt werden, die eine schnellere Suche als eine einfache Liste ermöglicht.

0

Mit Google collections libray:

List result1 = Lists.newArrayList(Collections2.filter(originalList,filterPredicate)); 
List result2 = Lists.newLinkedList(Collections2.filter(originalList,filterPredicate)); 

Während diese Sie eine richtige Liste geben, sie den Speicher-Overhead und Iteration Zeitaufwand sofort anfallen. Wenn Sie lieber, dass („lazy“ -Bewertung) verschieben möchten, können Sie eine Iterable oder Iterator für seriellen Zugriff verwenden:

Iterable result3 = Iterables.filter(originalList,filterPredicate)); // Pangea's solution 
Iterator result4 = Iterators.filter(originalList.iterator(),filterPredicate)); 

(ich die Art der Parametrierung als Übung dem Leser überlassen.)

Verwandte Themen