当前位置: 首页 > 知识库问答 >
问题:

如何根据对象属性知道映射是否包含该对象

崔恺
2023-03-14

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

}

但它为我返回假...请帮助我...谢谢提前

共有3个答案

凌景辉
2023-03-14

您需要重写hashcode()equals()方法,以在Test对象之间给出有意义的相等。
HashMap插入在hashcode上。
当我们将键和值都传递给put()方法以存储在HashMap上时,它使用键对象hashcode()方法来计算hashcode,并且它们通过在该hashcode上应用散列来标识存储值对象的桶位置,并且键equals()方法将用于标识HashMap中正确的键值对。

阅读更多:http://javarevisited.blogspot.com/2011/02/how-hashmap-works-in-java.html#ixzz2fDozSqmi

锺离俊雄
2023-03-14

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

陶福
2023-03-14

对于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);
  }
}

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

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

但是您的compare函数有一个问题——元素之间需要有逻辑顺序(因为您永远不会返回-1)<代码>字符串有一个比较器,您可以使用它:

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;
}
 类似资料: