【问题标题】:Using a hashmap with an object as key使用以对象为键的 hashmap
【发布时间】:2015-05-11 07:09:16
【问题描述】:

我尝试使用带有对象键的哈希图。 我可以填写哈希图。我可以使用 nbrCheminHashInter.keySet 显示 haskmap 的内容。但不可能得到,我总是收到一个空值。你能帮帮我吗?

public class MyKey<V> {
 private V u;
private V v;
private V i;

// Constructor MyKey
public MyKey(V i,V u,V v){
this.i=i; 
this.u=u;
this.v=v;
}

...
public String toString(){
     return ""+this.i+""+this.u + ""+ this.v ;
 }
}

for(V i:listeSommet){
 for(V u:listeSommet){
  for(V v:listeSommet){
   nbrCheminHashInter.put(new MyKey<V>(i,u,v),0.0);}}}

  //Print key and value
 for(MyKey<V> key :nbrCheminHashInter.keySet() ){
           System.out.println("Cle "+key+" value     "+nbrCheminHashInter.get(key));
       }
 //print always null           
 for(V i:listeSommet){
  for(V u:listeSommet){
   for(V v:listeSommet){
  System.out.println(nbrCheminHashInter.get(new MyKey<V>(i,u,v));
    }
   }
  }

【问题讨论】:

  • 覆盖 MyKey 类中的 hashCode

标签: java object hashmap key


【解决方案1】:

你需要重写 hashcode 和 equals

 public class MyKey<V> {
  private V u;
  private V v;
  private V i;

  // Constructor MyKey
  public MyKey(V i,V u,V v){
    this.i=i;
    this.u=u;
    this.v=v;
  }

  @Override
  public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;

    MyKey myKey = (MyKey) o;

    if (i != null ? !i.equals(myKey.i) : myKey.i != null) return false;
    if (u != null ? !u.equals(myKey.u) : myKey.u != null) return false;
    if (v != null ? !v.equals(myKey.v) : myKey.v != null) return false;

    return true;
  }

  @Override
  public int hashCode() {
    int result = u != null ? u.hashCode() : 0;
    result = 31 * result + (v != null ? v.hashCode() : 0);
    result = 31 * result + (i != null ? i.hashCode() : 0);
    return result;
  }

  public String toString(){
    return " "+this.i+" "+this.u + " "+ this.v ;
  }

  public static void main(String[] args) {
    HashMap<MyKey<String>,Double> map = new HashMap<MyKey<String>, Double>();
    map.put(new MyKey<String>("foo","bar","something"),2.1);
    map.put(new MyKey<String>("foo2","bar2","something2"),2.2);

    for (Map.Entry<MyKey<String>, Double> entry : map.entrySet()){
      System.out.println("key is: " + entry.getKey());
      System.out.println("Value is: " + entry.getValue());
    }
    System.out.println("test");
    System.out.println(map.get(new MyKey<String>("foo", "bar", "something")));
  }
}

【讨论】:

    【解决方案2】:

    从 Object 继承的 hashCode 的默认实现返回对象在 RAM 中的地址。

    当您尝试通过 get(new MyKey()) 从 HashMap 中获取值时,会创建一个新对象,并且在您的 RAM 中与此地址的映射中将没有对应的键。

    在您的 MyKey 类中覆盖 int hashCode()boolean equals(Object other)

    另一种解决方案是:

    for(MyKey<V> m : map.keySet()){
        println(map.get(m);
    }
    

    这会起作用,因为您正在处理 RAM 中相同位置的相同对象

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-14
      相关资源
      最近更新 更多