2012-09-19 18 views
36

Mam ArrayList z niestandardowymi obiektami. Chcę przeszukać wewnątrz tej tablicy ArrayList dla ciągów.Wyszukiwanie w ArrayList z niestandardowymi obiektami dla niektórych łańcuchów

Klasa dla obiektów wyglądać następująco:

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 

wiem jak wyszukać ciąg w ArrayList, ale jak to zrobić w ArrayList z moich własnych obiektów:

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

Tak więc chcę mieć funkcję wyszukiwania w mojej tablicy ArrayList, na przykład pięć obiektów dla wszystkich ciągów "nazwa".

Odpowiedz

69

Najłatwiej dokonać for gdzie można sprawdzić, czy atrrtibute name obiektu niestandardowego mieć żądany ciąg

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

myślę, że to pomaga.

+0

również wypróbował ten, ale nie znalazł mojego ciągu. Jeśli przekonwertuję moją ArrayList na String, wygląda to tak: [[[true] [Wippe links oben] [1] [1.001] [Low] [1]], [[true] [Wippe rechts] [1] [1.001] [Low] [2]], [[true] [Temperaturwert] [7] [7.001] [Low] [256]], [[true] [Schalten (Status)] [1] [1.001] [Low] [257 ]]] ' –

+0

Co to jest ciąg, który chcesz znaleźć w tym przykładzie? –

+0

Próbowałem 'String search =" 1.001 ";' –

5

spróbować tej

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

Możliwe wyjątki NullPointerException, jeśli funkcja getName() nie jest skonfigurowana. – gtgaxiola

+1

tylko myślenie, że ustawiona jest każda wartość dla danego obiektu. –

+0

Dobrze! @Sharath G – gtgaxiola

3

Prawdopodobnie coś takiego:

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

metoda po prostu wywołuje equals() na ArrayList elementy, dzięki czemu można przeciążać klasa na equals() na podstawie zmiennej name klasy. Zwróć true z equals(), jeśli name jest równa pasującej String. Mam nadzieję że to pomoże.

+0

Czy to nie przeszkadza mu w poszukiwaniach na innych polach? – gtgaxiola

+0

@gtgaxiola, robi to, a także nie jest dobrą decyzją w zakresie projektowania, ale zwykle nie jest dobrze porównywać różne typy danych. – Egor

4

Aby niestandardowa klasa działała prawidłowo w kolekcjach, należy zastosować/zastąpić metody klasy. W celu sortowania zastąp także compareTo().

Przeczytaj artykuł this article lub google, jak prawidłowo wdrożyć te metody.

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: Korzystanie Java 8 Składnia

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

Jeśli nie przeszkadza przy użyciu zewnętrznego libaray - można użyć Predicates z Google Guava library następująco:

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

Działa tylko dla Java 8 niestety ... – nterry

+0

Wreszcie java 8 ma notację funkcjonalną. Rulz! –

+0

Potrzebuję podobnego rozwiązania dla Java 7, ponieważ Android ssie Javę 8 na niższych API –

1

Zastosowanie Apache CollectionUtils :

CollectionUtils.find(myList, new Predicate() { 
    public boolean evaluate(Object o) { 
     return name.equals(((MyClass) o).getName()); 
    } 
} 
Powiązane problemy