Kategorien
Allgemein

Gefilterte Listen

sind keine Neuigkeit und daher auch schon von anderen Implementiert.

Ich wollte aus einer Liste von Elementen nur ganz bestimmte Elemente holen und über diese direkt iterieren. Da die Elemente immer wieder nach unterschiedlichen Kriterien gefiltert werden sollten, dachte ich mir dass ich das ja verallgemeinern könnte. Eventuell mit einem Filter Interface:

interface Filter<T> {
   boolean isCase(T element);
}

Und einer allgemeinen Filterfunktion:

List<T> filterList(List<T> listOfElements, Filter<T> filter) {
   List<T> filteredElements = new ArrayList<T>();
   for (T element: listOfElements) {
      if (filter.isCase(element)) {
         filteredElements.add(element);
      }
   }
   return filteredElements;
}

Dann habe ich einfach mal filter und list und java in google eingegeben und bin (natürlich) über andere Leute mit demselben Problem und ähnlichen Ansätzen gestossen.

Bei google-collections und bei den jakarta-commons (mit generics). Dort werden allerdings auch direkt schon Iteratoren bereitgestellt, die filtern können und vieles mehr.

Also auch diesmal muss man das Rad nicht neu erfinden. Schade 🙂

Bei google-collections heissen die Filter im übrigen Predicates.

2 Antworten auf „Gefilterte Listen“

Filter gibt es in Java schon seit einer ganzen Weile

Z. B. den FileFilter (ich glaube, aus dem JDK 1.3 oder sogar früher). Da leitet man entweder eine Filterklasse von der Klasse FileFilter ab oder implementiert das entsprechende Interface. Im Interface ist nur die eine Methode „accept“ interessant, die je nach übergebenem File entweder „true“ oder „false“ liefert. Die entsprechende Klasse wird häufig als private Klasse implementiert.

Siehe z. B.: http://java.sun.com/%5B…%5D/filechooser.html

Aber der FileFilter ist eben ein ganz spezieller Fall. Mir ging es eher um allgemeine Listen, bzw. Collections. Und da habe ich im Standard JDK nichts gefunden.

Aber vielleicht bin ich auch einfach blind.

Schreibe einen Kommentar zu felix Antworten abbrechen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert