2012-09-19 26 views
36

Tengo una ArrayList con objetos personalizados. Quiero buscar dentro de este ArrayList para cadenas.Búsqueda en una ArrayList con objetos personalizados para ciertas cadenas

La clase de los objetos tener este aspecto:

public class Datapoint implements Serializable { 

    private String stateBased; 
    private String name; 
    private String priority; 
    private String mainNumber; 
    private String groupadress; 
    private String dptID; 

    public Datapoint(){ 
    } 

    public String getMainNumber() { 
    return mainNumber; 
    } 

    public void setMainNumber(String mainNumber) { 
    this.mainNumber = mainNumber; 
    } 

    public String getName() { 
    return name; 
    } 

    ..and so on 

Sé cómo buscar una cadena en un ArrayList, pero cómo hacerlo en un ArrayList con mis objetos personalizados:

ArrayList<String> searchList = new ArrayList<String>(); 
String search = "a"; 
int searchListLength = searchList.size(); 
for (int i = 0; i < searchListLength; i++) { 
if (searchList.get(i).contains(search)) { 
//Do whatever you want here 
} 
} 

Así que quiero tener una función para buscar en mi ArrayList con, por ejemplo, cinco objetos para todas las cadenas de "nombre".

Respuesta

69

La forma más fácil es hacer una for donde verificar si el atrrtibute name del objeto personalizado tiene la cadena deseada

for(Datapoint d : dataPointList){ 
     if(d.getName() != null && d.getName().contains(search)) 
      //something here 
    } 

creo que esto le ayuda.

+0

también probé esta, pero no encuentra mi String. Si convierto mi ArrayList en String, se ve así '[[[true] [Wippe links oben] [1] [1.001] [Low] [1]], [[true] [Wippe rechts] [1] [1.001] [Bajo] [2]], [[verdadero] [Temperaturwert] [7] [7.001] [Bajo] [256]], [[verdadero] [Schalten (Estado)] [1] [1.001] [Bajo] [257 ]]] ' –

+0

¿Cuál es la cadena que desea encontrar en ese ejemplo? –

+0

Intenté 'String search =" 1.001 ";' –

5

probar esto

ArrayList<Datapoint > searchList = new ArrayList<Datapoint >(); 
String search = "a"; 
int searchListLength = searchList.size(); 
for (int i = 0; i < searchListLength; i++) { 
if (searchList.get(i).getName().contains(search)) { 
//Do whatever you want here 
} 
} 
+1

Posible excepción NullPointerException si getName() no está configurado. – gtgaxiola

+1

simplemente pensando que todos y cada uno de los valores para el objeto particular están configurados. –

+0

bueno! @Sharath G – gtgaxiola

3

Probablemente algo como:

método
ArrayList<DataPoint> myList = new ArrayList<DataPoint>(); 
//Fill up myList with your Data Points 

//Traversal 
for(DataPoint myPoint : myList) { 
    if(myPoint.getName() != null && myPoint.getName().equals("Michael Hoffmann")) { 
     //Process data do whatever you want 
     System.out.println("Found it!"); 
    } 
} 
2

sólo llama equals() en ArrayList elementos, por lo que puede sobrecargar de equals() su clase basada en la variable name clase. Devuelva true desde equals() si name es igual al String correspondiente. Espero que esto ayude.

+0

¿Esto no le impide buscar en otros campos? – gtgaxiola

+0

@gtgaxiola, lo hace, y tampoco es una buena decisión en cuanto al diseño, pero generalmente no es bueno comparar diferentes tipos de datos. – Egor

4

Para que una clase personalizada funcione correctamente en colecciones, deberá implementar/anular los métodos equals() de la clase. Para ordenar también anule compareTo().

Consulte this article o google sobre cómo implementar esos métodos correctamente.

0
String string; 
for (Datapoint d : dataPointList) {  
    Field[] fields = d.getFields(); 
    for (Field f : fields) { 
     String value = (String) g.get(d); 
     if (value.equals(string)) { 
     //Do your stuff 
     }  
    } 
} 
32

ACTUALIZACIÓN: Uso de Java 8 Sintaxis

List<DataPoint> myList = new ArrayList<>(); 
//Fill up myList with your Data Points 

List<DataPoint> dataPointsCalledJohn = 
    myList 
    .stream() 
    .filter(p-> p.getName().equals(("john"))) 
    .collect(Collectors.toList()); 

Si no les importa usar un libaray externa - se puede utilizar Predicates del Google Guava library de la siguiente manera:

class DataPoint { 
    String name; 

    String getName() { return name; } 
} 

Predicate<DataPoint> nameEqualsTo(final String name) { 
    return new Predicate<DataPoint>() { 

     public boolean apply(DataPoint dataPoint) { 
      return dataPoint.getName().equals(name); 
     } 
    }; 
} 

public void main(String[] args) throws Exception { 

    List<DataPoint> myList = new ArrayList<DataPoint>(); 
    //Fill up myList with your Data Points 

    Collection<DataPoint> dataPointsCalledJohn = 
      Collections2.filter(myList, nameEqualsTo("john")); 

} 
+1

Solo funciona para Java 8 tristemente ... – nterry

+0

Finalmente java 8 tiene notación funcional. Rulz! –

+0

Necesito una solución similar para Java 7 porque Android chupa Java 8 en API más bajas –

1

Uso Apache CollectionUtils :

CollectionUtils.find(myList, new Predicate() { 
    public boolean evaluate(Object o) { 
     return name.equals(((MyClass) o).getName()); 
    } 
} 
Cuestiones relacionadas