【问题标题】:Searching in a ArrayList with custom objects for certain strings在具有自定义对象的 ArrayList 中搜索某些字符串
【发布时间】:2023-03-22 06:08:01
【问题描述】:

我有一个带有自定义对象的 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 中搜索所有“名称”字符串,例如五个对象。

【问题讨论】:

    标签: java search arraylist custom-object


    【解决方案1】:

    试试这个

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

    【讨论】:

    • 如果未设置 getName(),可能会出现 NullPointerException。
    • 只是认为特定对象的每个值都已设置。
    • 如果我将 ArrayList 转换为 String 它看起来像这样 [[[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 ]]] 。如果我使用例如String search = "1.001"; 它找不到任何字符串......你有什么想法吗? ——
    • 你为什么要把它转换成字符串?您是否有兴趣查找字符串搜索是否在您的数组列表中,无论它是在 stateBased 还是 name 或 priority 或 mainNumber 或 groupadress 或 dptID?
    【解决方案2】:

    大概是这样的:

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

    【讨论】:

      【解决方案3】:

      contains() 方法只在ArrayList 元素上调用equals(),因此您可以基于name 类变量重载类的equals()。如果name 等于匹配的String,则从equals() 返回true。希望这会有所帮助。

      【讨论】:

      • 这不妨碍他搜索其他领域吗?
      • @gtgaxiola,确实如此,而且在设计方面也不是一个好的决策,但比较不同的数据类型通常不好。
      【解决方案4】:

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

      请参阅this article 或 google,了解如何正确实施这些方法。

      【讨论】:

        【解决方案5】:

        简单的方法是创建一个for,您可以在其中验证自定义对象的属性name 是否具有所需的字符串

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

        我认为这对你有帮助。

        【讨论】:

        • 也试过这个,但没有找到我的字符串。如果我将我的 ArrayList 转换为 String 它看起来像这样 [[[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 ]]]
        • 你想在那个例子中找到什么字符串?
        • 好的。我发布的代码仅搜索名称属性。您可以在 te IF 子句中添加其他验证。喜欢:d.getMainNumber().contains... 这将解决问题,但不是一个漂亮的解决方案。未来属性会改变吗?
        • 啊当然....属性总是相同的,所以我将实现六个 if 子句,这应该可以解决我的问题。你知道更好或更漂亮的解决方案吗?如何找出“MainNumber”的属性“Name”?
        • 您可以在 Datapoint 类中实现一个方法,对所有属性进行验证。这样,您只需在 IF 处调用此方法,如果对象在一个属性处具有所需的字符串,它将返回。其他解决方案是使用反射并获取所有方法,但我认为这太过分了。
        【解决方案6】:
        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
              }    
           }
        }
        

        【讨论】:

          【解决方案7】:

          更新:使用 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 library 的 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"));
          
          }
          

          【讨论】:

          • 终于 java 8 得到了函数式表示法。鲁尔兹!
          • 我需要一个类似的 Java 7 解决方案,因为 Android 在较低的 API 上使用 Java 8
          • 这个答案和上一个答案有区别吗?
          【解决方案8】:

          使用Apache CollectionUtils:

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

          【讨论】:

            【解决方案9】:
            boolean found;
            
            for(CustomObject obj : ArrayOfCustObj) {
            
               if(obj.getName.equals("Android")) {
            
                  found = true;
               }
            }
            

            【讨论】:

              猜你喜欢
              • 2015-10-20
              • 2015-05-26
              • 2013-08-04
              • 2020-03-21
              • 1970-01-01
              • 1970-01-01
              • 2020-11-19
              • 2021-06-22
              • 2015-11-26
              相关资源
              最近更新 更多