我正在使用地图,并希望使用值对象作为地图键...以及列表作为值。值对象有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;
}
}
但它对我来说是假的..请帮助我..提前谢谢
答案 0 :(得分:5)
对于HashMap
,您需要覆盖班级中的equals
和hashCode
。
可能的实施:
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