【问题标题】:Attempting to use .contains() Java method尝试使用 .contains() Java 方法
【发布时间】:2025-12-08 08:00:01
【问题描述】:

这是我的“主要”代码:

ArrayList<Person> people = new ArrayList<Person>();

  people.add(new Person("Aaron Morgan", 31));
  people.add(new Person("Faye Palmer", 27));
  people.add(new Person("Dexter Koh", 33));
  people.add(new Person("Sallie Axl", 25));

  if (people.contains(new Person("Adam Kelly", 48)))
  {
     System.out.print("MATCH FOUND");
  }

    else
  {
     System.out.print("MATCH NOT FOUND");
  }

我正在尝试创建一种方法,将“Adam Kelly”与数组列表中的人员列表进行比较。我可以很好地将“亚当凯利”纳入方法中,但是我不确定我打算如何在类/方法中进行比较。

任何人都可以对此有所了解吗?

【问题讨论】:

  • 你需要实现Person#equals(Object)(对于Person#hashCode()也应该这样做)。否则,我真的看不到“问题”。
  • 您自己决定equals 之间的Person 对象的实际含义。

标签: java arraylist contains


【解决方案1】:

有一种简单的方法可以做到这一点。 首先,您必须为 ArrayList 创建一个迭代器。

Iterator it = people.iterator();

然后探索所有元素并进行比较

while ( it.hasNext() ) {
  Object obj = it.next();
  Person person= (Person)obj;
  if(person.getName().equals("Adam Kelly") && person.getAge().equals("43"))
  {
   System.out.print("MATCH FOUND");
   }
else{
   System.out.print("MATCH NOT FOUND");
  }
}

希望这能解决您的问题。

【讨论】:

    【解决方案2】:

    在您的 People 类中,您需要实现 equals 方法。

    public boolean equals(Object obj) {
      if (obj instanceof Person) {
        Person p = (Person) obj;
        return ((this == obj) || (this.getName().equals(p.getName()) && 
               this.getAge() == p.getAge()));
      }
      return false;
    }
    

    【讨论】:

      【解决方案3】:

      基本上,您需要通过在 Object 类中使用 Java 的 equalshashcode 来实现对象相等。否则它将使用 Object 类实现,该实现只使用 == 运算符检查引用。

      在你的类 Person 中有这样的东西:

      class Person {
      
          // your fields and stuff
      
          @Override
          public boolean Equals(Object o) {
              if (o == null) {
                  return false;
              }
              if (!(o instanceof Person)) {
                  return false;
              }
      
              Person that = (Person) o;
      
                  if(this.name != null){
                      return (this.name.equals(that.name)) && (this.age == that.age);
                  }
      
                  return false;
          }
      
          @Override
          public int hashCode(){
                // use a library here!
          }
      
      } 
      

      【讨论】:

        【解决方案4】:

        在您的Person 类中像这样实现.equals()

        @Override
        public boolean equals(Object o) {
         if(o == null) { return false; }
         if(!(o instanceof Person)) { return false; }
        
         Person person = (Person) o;
         return this.name.equals(person.getName()) && this.age == person.getAge();
        }
        

        .contains() 方法将根据 .equals() 表示形式查找现有值。引用类型的标准实现只是对象在内存中的地址位置。由于您有两个不同的对象,这将返回不同的地址,因此不会被找到。

        您需要做的是创建自己的实现,使用您想要的字段。

        【讨论】:

        • +1 用于读心术,因为 OP 没有解释他的第二个参数的含义。
        • name 是一个字符串,不要使用 ==。
        • equals() 必须小写!
        • 你会得到一个无名的 NPE。
        • @ArneBurmeister:干杯。我已回滚您的编辑,因为它错过了一些中间编辑。无需检查getName() != null,它应该只返回false
        【解决方案5】:

        Constains 依赖于 Object 的 equals() 实现。所以你需要为 Person() 写一个相等的实现。无论哪种方式,列表中的 contains() 都不是最优的,并且运行时间为 O(n)。最好使用基于哈希的集合,即 Set() 并确保 Person 具有有效的 hashCode() 和 equals() 实现。

        【讨论】:

          【解决方案6】:

          必须编写自定义的equals方法,在其中比较属性

          equals(Object obj) 
          

          【讨论】: