如何在一组自定义对象中查找对象

时间:2013-04-23 09:03:29

标签: java hashset

下面的代码包含一组CustomObjects。我正在尝试搜索其中的对象。

我已经覆盖了equals()方法以将其与特定字段匹配,我无法理解为什么它无法找到它。

  

" XX \ t未找到\ tXX"

正在打印 的

  

"实测值!!"

import java.util.HashSet; import java.util.Set;

public class TestEquals {

  private static Set<CustomObject> setCustomObjects;    

  public static void main(String[] args){
    setCustomObjects = new HashSet<CustomObject>();

    setCustomObjects.add(new CustomObject(2, "asas"));
    setCustomObjects.add(new CustomObject(3, "gdhdf"));
    setCustomObjects.add(new CustomObject(4, "bnbv"));
    setCustomObjects.add(new CustomObject(5, "ljhj"));

    AnotherObject anObj = new AnotherObject(3, 4);

    if(setCustomObjects.contains(anObj)){
        System.out.println("Found!!");
    }else{
        System.out.println("XX\tNot Found\tXX");
    }
  }
}


class CustomObject {

  public CustomObject(int test, String name) {
    this.test = test;
    this.name = name;
  }

  private int test;
  private String name;

  @Override
  public boolean equals(Object obj) {
    if(obj instanceof AnotherObject){
        AnotherObject temp = (AnotherObject)obj;
        System.out.println("test" + temp.getOtherTest());
        return this.test == temp.getOtherTest();
    }
    return true;
  }

  @Override
  public int hashCode() {
    int hash = 22;
    hash = 32 * hash + this.test;
    return hash;
  }

}


class AnotherObject {

  public AnotherObject(int otherTest, double test2) {
    this.otherTest = otherTest;
    this.test2 = test2;
  }

  private int otherTest;
  private double test2;

  public int getOtherTest() {
    return otherTest;
  }
  public void setOtherTest(int otherTest) {
    this.otherTest = otherTest;
  }
}

3 个答案:

答案 0 :(得分:2)

您尚未在equals中覆盖hashCodeAnotherObject。这样做,你应该得到你期望的。

答案 1 :(得分:1)

这是不是一个好习惯,不要试图将来自不同无关类的2个对象视为等于。

您可以通过使用来自其他类的相同逻辑为hashCode()编写AnotherObject来解决此问题,但是您将拥有重复的代码,因为这两个类都需要它如果您希望使用HashSet将其视为相等,则以相同的方式计算

答案 2 :(得分:0)

HashSet内部使用HashMap。你的CustomObject&amp; AnotherObject哈希也必须等于找到它。

根据您所关注的int为AnotherObject实现hashCode。