66

我有一个带有自定义对象的 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
}
}

所以我想有一个函数在我的 ArrayList 中搜索,例如所有“名称”字符串的五个对象。

4

9 回答 9

106

简单的方法是在for哪里验证name自定义对象的属性是否具有所需的字符串

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

我认为这对你有帮助。

于 2012-09-19T13:51:02.273 回答
43

更新:使用 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 库中的谓词,如下所示:

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

}
于 2012-09-19T14:06:23.160 回答
8

尝试这个

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
}
}
于 2012-09-19T13:46:33.500 回答
5

要使自定义类在集合中正常工作,您必须实现/覆盖equals()该类的方法。对于排序也覆盖compareTo()

有关如何正确实现这些方法的信息,请参阅本文或 google。

于 2012-09-19T13:50:18.820 回答
5

大概是这样的:

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!");
     }
}
于 2012-09-19T13:46:45.557 回答
2

contains()方法只调用元素,因此您可以基于类变量重载您equals()的类。从if中返回等于匹配的。希望这可以帮助。ArrayListequals()nametrueequals()nameString

于 2012-09-19T13:48:54.280 回答
1

使用Apache CollectionUtils

CollectionUtils.find(myList, new Predicate() {
   public boolean evaluate(Object o) {
      return name.equals(((MyClass) o).getName());
   }
}
于 2013-07-19T17:57:20.987 回答
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
      }    
   }
}
于 2012-09-19T14:05:03.503 回答
0
boolean found;

for(CustomObject obj : ArrayOfCustObj) {

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

      found = true;
   }
}
于 2019-04-22T06:59:22.247 回答