2012-06-11 11 views
12

Tengo una lista de elementos, y quiero encontrar una lista de elementos que tienen la propiedad booleana x=true.¿Cómo encontrar elementos en una colección por propiedad?

Sé que esto se puede lograr por iteración, pero estaba buscando un método común para hacerlo en la biblioteca de commons como Apache Commons.

+0

propiedad = variable de campo? – dacwe

+0

@dacwe, sí, eso es lo que quise decir, lo siento. –

+0

¿Cómo entiendes 'método genérico'? –

Respuesta

11

El problema es que la iteración en Java es a menudo mucho más simple y más clara. Quizás los cierres de Java 8 arreglarán esto. ;)

Comparar con la solución de @ Spaeth.

List<String> mixedup = Arrays.asList("A", "0", "B", "C", "1", "D", "F", "3"); 
List<String> numbersOnlyList = new ArrayList<>(); 
for (String s : mixedup) { 
    try { 
     // here you could evaluate you property or field 
     Integer.valueOf(s); 
     numbersOnlyList.add(s); 
    } catch (NumberFormatException ignored) { 
    } 
} 
System.out.println("Results of the iterated List: " + numbersOnlyList); 

Como puede ver, es mucho más corto y conciso.

+3

Si tiene predicados codificados, entonces es verdadero. Pero cuando se necesita extender la lógica y proporcionar varios elementos para la expresión lógica que al final dan el conjunto de datos adecuado, el limpiador es una API de modismos funcional como la guayaba propuesta. –

+0

@Vash +1 Esto es cierto, pero relativamente raro. Por cierto: uso predicados en una biblioteca que escribí, así que no estoy en contra de ellos. –

21

Puede utilizar la colección de Apache commons implementando un predicado para ello.

http://commons.apache.org/collections/apidocs/org/apache/commons/collections/CollectionUtils.html

muestra:

package snippet; 

import java.util.Arrays; 
import java.util.Collection; 

import org.apache.commons.collections.CollectionUtils; 
import org.apache.commons.collections.Predicate; 

public class TestCollection { 

    public static class User { 

     private String name; 

     public User(String name) { 
      super(); 
      this.name = name; 
     } 

     public String getName() { 
      return name; 
     } 

     public void setName(String name) { 
      this.name = name; 
     } 

     @Override 
     public String toString() { 
      return "User [name=" + name + "]"; 
     } 

    } 

    public static void main(String[] args) { 
     Collection<User> users = Arrays.asList(new User("User Name 1"), new User("User Name 2"), new User("Another User")); 
     Predicate predicate = new Predicate() { 

      public boolean evaluate(Object object) { 
       return ((User) object).getName().startsWith("User"); 
      } 
     }; 
     Collection filtered = CollectionUtils.select(users, predicate); 
     System.out.println(filtered); 
    } 
} 

Algunos de muestra se puede encontrar aquí: http://apachecommonstipsandtricks.blogspot.de/2009/01/examples-of-functors-transformers.html

Y si necesita algo más genérico, como inspeccionar un valor de un campo o propiedad específica usted podría hacer algo como:

public static class MyPredicate implements Predicate { 

    private Object expected; 
    private String propertyName; 

    public MyPredicate(String propertyName, Object expected) { 
     super(); 
     this.propertyName = propertyName; 
     this.expected = expected; 
    } 

    public boolean evaluate(Object object) { 
     try { 
      return expected.equals(PropertyUtils.getProperty(object, propertyName)); 
     } catch (Exception e) { 
      return false; 
     } 
    } 

} 

que podría comparar una propiedad específica a un valor esperado, y el uso sería algo así como:

Collection filtered = CollectionUtils.select(users, new MyPredicate("name", "User Name 2")); 
+0

Gracias por el predicado :) –

+1

Esta debería ser la respuesta elegida. –

+1

El uso de CollectionsUtils.select devuelve una colección nueva o esta nueva colección contiene referencias a la colección original. Intenté usar esto definiendo mi propio predicado, sin embargo, mis dos colecciones se están modificando. – Rohan

1

Para lograr esto en Java, puede anular hashCode y es igual a métodos -

por ejemplo

@Override 
public int hashCode() { 
    return eventId; 
} 

@Override 
public boolean equals(Object obj) { 
    if(obj instanceof CompanyTimelineView) { 
     CompanyTimelineView new_name = (CompanyTimelineView) obj; 
     if(new_name.eventId.intValue() == this.eventId.intValue()){ 
      return true; 
     } 
    } 
    return false; 
} 

en este ejemplo he mached eventId integer value. Puedes usar tu clase y su propiedad aquí. Después de esto, puede usar el contenido de la lista contiene, indexOf, lastIndexOf y get para encontrar el elemento en la lista. Vea abajo.

//tempObj is nothing but an empty object containing the essential properties 
//tempObj should posses all the properties that are being compared in equals method. 

if(listOfObj.contains(tempObj)){ 
    return listOfObj.get(listOfObj.indexOf(tempObj)); 
} 
Cuestiones relacionadas