4

我正在使用地图并希望将值对象用作地图键..并将列表用作值。值对象有 2 个属性名字,名字..如果两个属性都与同一个地图中的某个键匹配,我想返回 map.containsKey() 为真..

我尝试使用如下比较器

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

4 回答 4

5

对于 a 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;
}
于 2013-09-18T06:05:38.720 回答
0

You need override the hashcode() and equals() methods to give meaningful equality between the Test object.
HashMap insertions is bassed on the hashcode.
When we pass an both key and value to put() method to store on HashMap , it uses key object hashcode() method to calculate hashcode and they by applying hashing on that hashcode it identifies bucket location for storing value object and keys equals () method will be used to identify correct key value pair in HashMap .

Read more: http://javarevisited.blogspot.com/2011/02/how-hashmap-works-in-java.html#ixzz2fDozSqmi

于 2013-09-18T06:09:39.727 回答
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 方法。Java 文档中的更多信息

我给出的 equals 的实现只是一个例子。对于正确的实施,你应该阅读这个

于 2013-09-18T06:02:21.410 回答
0

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

于 2013-09-18T06:04:20.773 回答