我尝试使用带有对象键的hashmap。 我可以填写hashmap。我可以用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));
}
}
}
答案 0 :(得分:0)
您需要覆盖hashcode并等于
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")));
}
}
答案 1 :(得分:0)
从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中相同位置的相同对象