2012-09-19 20 views
36

Özel nesneler içeren bir ArrayList'im var. Dizeler için bu ArrayList içinde aramak istiyorum.Belirli dizeler için özel nesnelerle ArrayList'te arama

nesneler için

sınıf şuna benzer:

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

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 

Bir ArrayList bir dize aramak için ama nasıl benim özel nesnelerle bir ArrayList bunun nasıl yapılacağını biliyorum

Dolayısıyla, ArrayList'imde arama yapmak için bir işlev istiyorum, örneğin tüm "ad" dizeleri için beş nesne.

cevap

69

kolay yolu bir for yapmaktır.

+0

da bunu denedi, ancak String'imi bulamıyor. ArrayList'imi String'e dönüştürürsem, şöyle görünür: [[[true] [Wippe link oben] [1] [1.001] [Low] [1]], [[true] [Wippe rechts] [1] [1.001] [Low] [2]], [[true] [Temperaturwert] [7] [7.001] [Düşük] [256]], [[true] [Schalten (Durum)] [1] [1.001] [Düşük] [257 ]]] ' –

+0

Bu örnekte bulmak istediğiniz String nedir? –

+0

Denedim dize arama = "1.001"; –

5

gibi bu Muhtemelen

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

getName() ayarlanmamışsa, olası NullPointerException. – gtgaxiola

+1

Sadece belirli bir nesne için her bir değerin ayarlandığını düşünün. –

+0

iyi! @Sharath G – gtgaxiola

3

şey denemek: Eğer aşırı böylece

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

yöntem sadece, equals()ArrayList üzerinde elemanlarını çağırır name sınıf değişkeni temel alarak sınıf en equals(). eşleşme String eşleşmesiequals() döndürür. Bu yardımcı olur umarım.

+0

Bu, başka alanlarda arama yapmasını engelliyor mu? – gtgaxiola

+0

@gtgaxiola, Bu, ve aynı zamanda tasarım açısından iyi bir karar değil, ancak farklı veri türlerini karşılaştırmak genellikle iyi değil. – Egor

4

Özel sınıfın koleksiyonlarda düzgün çalışması için, sınıfın equals() yöntemlerini uygulamanız/geçersiz kılmanız gerekir. Sıralama için compareTo() geçersiz kılınır.

this article sayfasına bakın veya bu yöntemleri düzgün bir şekilde uygulamak için Google'a bakın. Özel nesnenin atrrtibute name istenen dize

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

Bu size yardımcı olur düşünmek varsa doğrulamak nerede

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

GÜNCELLEME: Harici libaray kullanarak sakıncası yoksa

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

Java 8 Syntax'i kullanma - aşağıdaki gibi Google Guava library den Predicates kullanabilirsiniz:

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

Sadece Java 8 için çalışıyor ... – nterry

+0

Son olarak java 8 işlevsel göstergeye sahiptir. Rulz! –

+0

Java 7 için benzer bir çözüme ihtiyacım var çünkü Android daha düşük API'larda Java 8'i kullanıyor –

1

Kullanım Apache CollectionUtils :

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