Java 如何根据对象属性知道贴图是否包含该对象
我正在使用一个映射,希望使用一个值对象作为映射键,并使用一个列表作为值。value对象有两个属性:第一个名称和第二个名称。如果两个属性都与同一映射中的某个键匹配,我希望将map.containsKey()返回为true 我尝试使用比较器,如下所示Java 如何根据对象属性知道贴图是否包含该对象,java,Java,我正在使用一个映射,希望使用一个值对象作为映射键,并使用一个列表作为值。value对象有两个属性:第一个名称和第二个名称。如果两个属性都与同一映射中的某个键匹配,我希望将map.containsKey()返回为true 我尝试使用比较器,如下所示 public class comaparatorEx implements Comparator<Test>{ public static void main(String args[]){ Map m= new
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;
}
}
但是它为我返回false..请帮助我..提前谢谢您必须在测试类中重写默认的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方法。更多信息请访问
我给出的equals的实现只是一个例子。对于正确的实现,您应该HashMap在内部使用hashCode()和equals()方法来确定要查找的bucket,以及该bucket中的对象是否相同。您将需要为您的测试类实现这两者,否则它将有效地默认为引用相等(即,它们是完全相同的对象)对于
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());
您需要重写
hashcode()
和equals()
方法,以便在Test
对象之间提供有意义的相等性。HashMap
插入基于hashcode
当我们将键和值同时传递给
put()
方法以存储在HashMap
上时,它使用键对象hashcode()
方法来计算hashcode
,它们通过对hashcode
应用哈希来识别存储值对象的存储桶位置,并且键等于()方法将用于在HashMap中标识正确的键值对
阅读更多信息:t是另一个对象。在这里,使用t2的对象无法找到它-m.containsKey(t2)。如果t和t2是整数,那么它就会工作。在
If(obj==null | | |!(obj instanceof Test))
中,不需要进行第一次比较<如果obj
为null,则code>obj instanceof Test将为false。测试null!=0是毫无意义的,因为它总是正确的。@ViktorSeifert这本来就是o。我已经编辑了答案。好的,这很有意义。您对equals
的实现很好。您可以省略null!=o
因为如果o为空,则测试的o实例
为假。但是,如果您超越了等于
,那么您还必须重写hashCode
,否则您就违反了hashCode
的约定。
Map m = new TreeMap<Test,List<String>>(new comaparatorEx());
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;
}