web-dev-qa-db-ja.com

特定の文字列のカスタムオブジェクトを使用してArrayListを検索する

カスタムオブジェクトを持つArrayListがあります。このArrayList内で文字列を検索します。

オブジェクトのクラスは次のようになります。

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

ArrayListで文字列を検索する方法は知っていますが、カスタムオブジェクトを使用してArrayListで検索する方法は知っています。

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

そのため、たとえば、すべての「名前」文字列の5つのオブジェクトを使用して、ArrayListを検索する関数が必要です。

59
Mokkapps

簡単な方法は、カスタムオブジェクトの属性forに目的の文字列があるかどうかを確認するnameを作成することです

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

これはあなたの役に立つと思います。

90
Renato Lochetti

更新:Java 8構文の使用

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

外部libarayの使用を気にしない場合は、次のように Google GuavaライブラリPredicates を使用できます。

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

}
39
munyengm

これを試して

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

コレクションでカスタムクラスを適切に機能させるには、クラスのequals()メソッドを実装/オーバーライドする必要があります。並べ替えの場合は、compareTo()もオーバーライドします。

これらのメソッドを適切に実装する方法については、 この記事 またはgoogleを参照してください。

5
Ridcully

おそらく次のようなもの:

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!");
     }
}
4
gtgaxiola

contains()メソッドはArrayList要素でequals()を呼び出すだけなので、nameクラス変数に基づいてクラスのequals()をオーバーロードできます。 trueが一致するnameと等しい場合、equals()からStringを返します。お役に立てれば。

2
Egor

Apache CollectionUtilsを使用:

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

for(CustomObject obj : ArrayOfCustObj) {

   if(obj.getName.equals("Android")) {

      found = true;
   }
}
0
Sayali Shinde
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
      }    
   }
}
0
Greensy