如何根据对象属性知道地图是否包含该对象

时间:2013-09-18 05:54:32

标签: java

我正在使用地图,并希望使用值对象作为地图键...以及列表作为值。值对象有2个属性的第一个名称,第二个名称。如果两个属性都与同一个映射中的某个键匹配,则想要将map.containsKey()返回为true。

我尝试使用比较器如下

public class comaparatorEx  implements Comparator<Test>{
    public static void main(String args[]){

        Map m= new HashMap<Test,List<String>>();
        Test t = new Test();
        t.setFirstname("vamsi");
        t.setSecondname("priya");

        List descriptionList=new ArrayList();
        descriptionList.add("description1");
        m.put(t, descriptionList);
        Test t2 = new Test();
        t2.setFirstname("vamsi");
        t2.setSecondname("priya");

        if(m.containsKey(t2)){
            System.out.println("user found");
        }           
    }

    public int compare(Test o1, Test o2) {
    if((o1.firstname.equals(o2.firstname) )&& o1.secondname.equals(o2.secondname))
        return 0;
    else return 1;
    }
}

这是我使用的价值对象

public class  Test  {

String firstname;
String secondname;

public String getFirstname() {
    return firstname;
}
public void setFirstname(String firstname) {
    this.firstname = firstname;
}
public String getSecondname() {
    return secondname;
}
public void setSecondname(String secondname) {
    this.secondname = secondname;
}

}

但它对我来说是假的..请帮助我..提前谢谢

4 个答案:

答案 0 :(得分:5)

对于HashMap,您需要覆盖班级中的equalshashCode

可能的实施:

class Test
{
  ...
  @Override
  public int hashCode()
  {
     return 31*firstname.hashCode() + secondname.hashCode();
  }

  @Override
  public boolean equals(Object obj)
  {
     // basic type validation
     if (!(obj instanceof Test))
        return false;

     Test t = (Test)obj;
     return firstname.equals(t.firstname) && secondname.equals(t.secondname);
  }
}

Comparator适用于基于比较的集合,例如TreeMap。要使用它,请在构造函数中提供此类的实例:

Map m = new TreeMap<Test,List<String>>(new comaparatorEx());

但是你的compare函数存在问题 - 元素之间需要逻辑排序(没有你永远不会返回-1)。 String有一个compareTo,你可以使用它:

public int compare(Test o1, Test o2) {
  int result = o1.firstname.compareTo(o2.firstname);
  if (result == 0)
    return o1.secondname.compareTo(o2.secondname));
  else
    return result;
}

答案 1 :(得分:0)

您必须覆盖测试类中的默认equals方法。

你可以写这样的东西。

@Override
public boolean equals(Object o) {
    if(null != o && o instanceof test && o.attr1.equals(this.attr1)) return true;
    else return false;
}

containskey在map中查看equals方法。 the java docs

中的更多信息

我给出的equals的实现只是一个例子。为了正确实施,您应该read this

答案 2 :(得分:0)

HashMap在内部使用hashCode()和equals()方法来确定例如要查看的桶,以及该桶中的对象是否相同。您需要为Test类实现两者,否则它将有效地默认为引用相等(即它们是完全相同的对象)

答案 3 :(得分:0)

您需要覆盖hashcode()equals()方法,才能在Test对象之间实现有意义的平等。
HashMap插入基于hashcode 当我们将{key}和值传递给put()方法以存储在HashMap上时,它会使用关键对象hashcode()方法计算hashcode,并通过对{hashcode进行哈希来计算{{1}} 1}}它标识用于存储值对象的桶位置和键equals()方法将用于在HashMap中识别正确的键值对。

了解详情:http://javarevisited.blogspot.com/2011/02/how-hashmap-works-in-java.html#ixzz2fDozSqmi