2012-09-19 11 views
36

Ho una lista array con oggetti personalizzati. Voglio cercare all'interno di questo ArrayList per stringhe.Ricerca in una lista array con oggetti personalizzati per determinate stringhe

La classe per gli oggetti simile a questa:

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 

So come cercare una stringa in un ArrayList, ma come fare in un ArrayList con i miei oggetti personalizzati:

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

Quindi voglio avere una funzione per cercare nel mio ArrayList con ad esempio cinque oggetti per tutte le stringhe di "nome".

risposta

69

Il modo più semplice è quello di fare un for in cui si verifica se l'atrrtibute name dell'oggetto personalizzato ha la stringa desiderata

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

Penso che questo ti aiuta.

+0

ha provato anche questo, ma non trova la mia stringa. Se converto il mio ArrayList in String sembra che questo '[[[true] [Wippe links oben] [1] [1.001] [Basso] [1]], [[vero] [Wippe rechts] [1] [1.001] [Basso] [2]], [[vero] [Temperaturwert] [7] [7.001] [Basso] [256]], [[vero] [Schalten (Stato)] [1] [1.001] [Basso] [257 ]]] ' –

+0

Qual è la stringa che vuoi trovare in quell'esempio? –

+0

Ho provato 'String search =" 1.001 ";' –

5

provare questo

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

Possibile NullPointerException se getName() non è impostato. – gtgaxiola

+1

solo pensando che ogni singolo valore per l'oggetto specifico sia impostato. –

+0

buono! @Sharath G – gtgaxiola

3

Probabilmente qualcosa di simile:

metodo
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

chiama semplicemente equals() su ArrayList elementi, in modo da poter sovraccaricare del equals() la classe in base alla variabile name di classe. Restituire true da equals() se name è uguale al corrispondente String. Spero che questo ti aiuti.

+0

Questo non gli impedisce di cercare su altri campi? – gtgaxiola

+0

@gtgaxiola, Funziona, e non è neanche una buona decisione in termini di design, ma di solito non va bene per confrontare diversi tipi di dati. – Egor

4

Affinché una classe personalizzata funzioni correttamente nelle raccolte, è necessario implementare/sovrascrivere i metodi equals() della classe. Anche per l'ordinamento è necessario eseguire l'override di compareTo().

Vedere this article o google su come implementare correttamente tali metodi.

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

UPDATE: Utilizzo di Java 8 Sintassi

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

Se non ti dispiace utilizzando un libaray esterna - è possibile utilizzare Predicates dalla Google Guava library come segue:

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

Purtroppo funziona solo per Java 8 ... – nterry

+0

Finalmente java 8 ha ottenuto la notazione funzionale. Rulz! –

+0

Ho bisogno di una soluzione simile per Java 7 perché Android fa schifo su Java 8 su API inferiori –

1

Usa Apache CollectionUtils :

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