Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何根据对象属性知道贴图是否包含该对象_Java - Fatal编程技术网

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

Java 如何根据对象属性知道贴图是否包含该对象,java,Java,我正在使用一个映射,希望使用一个值对象作为映射键,并使用一个列表作为值。value对象有两个属性:第一个名称和第二个名称。如果两个属性都与同一映射中的某个键匹配,我希望将map.containsKey()返回为true 我尝试使用比较器,如下所示 public class comaparatorEx implements Comparator<Test>{ public static void main(String args[]){ Map m= new

我正在使用一个映射,希望使用一个值对象作为映射键,并使用一个列表作为值。value对象有两个属性:第一个名称和第二个名称。如果两个属性都与同一映射中的某个键匹配,我希望将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;
    }
}

但是它为我返回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;
}