【问题标题】:How to check or compare if an object is in an array list?如何检查或比较对象是否在数组列表中?
【发布时间】:2014-08-26 07:01:35
【问题描述】:

我已经创建了一个这样的 pojo 类:-

public class User{
    private int id;
    private String name;

    // Setter and getter methods
}

现在我已经创建了数组并在数组中添加了一些用户:

 List<User> users=new Arraylist<>();

 User user1=new User();
 user1.setId(1);
 user1.setName("ABC");
 users.add(user1);

 User user2=new User();
 user2.setId(2);
 user2.setName("MNO");
 users.add(user2);

 //...

现在我想找到用户 1 在用户列表中。如果用户规模很大,如何进行快速搜索?

【问题讨论】:

  • 你想通过他的ID搜索用户吗?
  • 覆盖equals并使用List接口的方法contains
  • @hsz 是的,我想按 ID 搜索用户
  • 那么您的问题标题非常具有误导性。你应该考虑改变它。

标签: java search arraylist


【解决方案1】:

List#contains() 方法做你想做的事。该方法使用equals() 方法来确定两个对象是否相同。因此,只需覆盖 equals() 并覆盖 hashCode()

如果您想通过 ID 快速搜索它们,我更愿意使用 HashMap&lt;Integer,User&gt; 而不是 List

【讨论】:

  • `如果用户规模很大,我该如何进行快速搜索?`
【解决方案2】:

如果你想执行快速搜索,你可以使用Set(或者Map,如果你想跟踪重复的数量)来存储数据,你还需要实现hashCode()和@ 987654324@ - 并使用HashSet,或者使用TreeSet 并提供Comparator

另一种解决方案是保持列表排序(关于某些Comparator)并使用Collections.binarySearch()

【讨论】:

    【解决方案3】:
    users.indexOf(user1);
    

    如果返回 -1,则 ArrayList 中不存在 user1。我相信这将是了解您的列表中是否存在用户对象的最简单方法。

    你可以有这样的条件:

    boolean userExists = (users.indexOf(aUserObject) >= 0) ? true : false;
    

    【讨论】:

      【解决方案4】:

      您必须按如下方式实现equals()hascode()

      class User{
      private int id;
      private String name;
      
      // Setter and getter methods
      public boolean equals(Object object) {
          boolean result = false;
          if (object == null || object.getClass() != getClass()) {
              result = false;
          } else {
              User user = (User) object;
              if (this.id==user.id) {
                  result = true;
              }
          }
          return result;
      }
      
      public int hashCode(Object o){
          return id;
        }
      }
      

      现在您可以简单地检查对象是否相等,如下所示:

      List<User> users=new Arraylist<>();
      
      User user1=new User();
      user1.setId(1);
      user1.setName("ABC");
      users.add(user1);
      
      User user2=new User();
      user2.setId(2);
      user2.setName("MNO");
      users.add(user2);
      
      if(users.contains(user2)) // this would check for a presence of user2 in the list
      
      //...
      

      注意:相等是通过类 User id 字段获得的。您可以选择任何字段或对其实现任何其他逻辑。

      【讨论】:

      • 您的代码错误。如果 a.equals(b) 则 a.hashCode() == b.hashCode()。当您使用 hashCode 字段名称时,该字段名称未在 equals 方法中进行测试,因此合同未履行。
      猜你喜欢
      • 1970-01-01
      • 2016-09-10
      • 2016-04-02
      • 1970-01-01
      • 2017-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-08
      相关资源
      最近更新 更多