2014-02-09 52 views
0

我对我的项目感到震惊......必须保持lang数组的大散列图....我试着用样本但它不工作....我不能存储数组中的键....在此先感谢...为什么我的hashmap会覆盖上次添加的值?

class K{ 
    int key; 
} 

class V{ 
    int data; 
} 

class hashmp{ 
    public static void main(String args[]){ 
     HashMap<K,V> hm=new HashMap<K,V>(); 
     K key1=new K(); 
     for(int i=0;i<5;i++){  
     V val=new V(); 
     key1.key=i; 
     val.data=i+5; 
     hm.put(key1,val); 
     } 
     System.out.println(); 
     for(int i=0;i<5;i++){ 
     key1.key=i; 
     V pt=hm.get(key1); 
     System.out.println("\n"+hm.containsKey(key1)+key1.key);  
     if(hm.containsKey(key1))  
      System.out.print(pt.data); 
     } 
    } 
} 

对于我得到....

true0 
9 
true1 
9 
true2 
9 
true3  
9 
true4  
9 

更新的代码.....

class K{ 
     long key; 
    } 

    class V{ 
     long[] v=new long[10];  
    }         

    public void putHash(V val1){  
     //some code   
    V s=new V();    
    K gt=new K();    
    gt.key=val1.v[0];     
    if(hm.containsKey(keyArr[(int)gt.key])){   
       s=hm.get(gt); //get value of key if exists    
     //some code to modify s    
    }     
    gt.key=val1.v[0];    
    hm.put(gt,s); // put the modified value back to same key  
}  

谢谢大家给我提供的答案...最后它工作得很好...感谢大家的贡献....

+0

你只是'Key'类的一个实例,所以它们全部相同(equals方法的默认实现中的第一个条件是同一个对象)。在循环内移动'new Key()',一切都很顺利(顺便说一下,重写map key的equals方法会更好)。 –

+0

这足以使用** get()**方法来查找我的条目....我想检索特定键的数据.... –

回答

1

HashMap存储您的密钥的引用。所以如果你改变密钥,它将在HashMap中被改变。如果您想要更改,请在for循环中移动标记K key1=new K();

0

首先做到以下几点:

HashMap<K, V> hm = new HashMap<K, V>(); 
      K key1 = null; 
      for (int i = 0; i < 5; i++) { 
       key1 =new K(); 
       V val = new V(); 
       key1.key = i; 
       val.data = i + 5; 
       hm.put(key1, val); 

      } 

我认为这个问题是在您完成的项目中HashMap的迭代

尝试做以下通过地图迭代的方式:

Iterator it = hm.entrySet().iterator(); 
      while (it.hasNext()) { 
       Map.Entry pairs = (Map.Entry)it.next(); 
       System.out.println(((K)pairs.getKey()).key + " = " + ((V)pairs.getValue()).data); 

       it.remove(); // avoids a ConcurrentModificationException 
      } 

您将获得正确的值。

或者你可以参考这个回答here看看如何迭代你的键或值。

并给我一些反馈

希望有帮助。

+0

他一直使用相同的键对象;地图中确实只有一个条目。 – chrylis

+0

@chrylis检查我的更新回答 –

+0

这将让他迭代,因此它回答了问题,但由于他在键上使用引用相等,他将无法执行任何查找;在这样的问题中,如果可以的话,回答潜在的问题(在这种情况下,编写他自己的'int'包装器)是有帮助的。 – chrylis

0

您在每个循环迭代中使用相同的K key1对象,并且即使它已经在地图中,也要修改同一个对象。您需要为地图中的每个条目创建一个不同的密钥K(或直接使用Integer而不是自己制作密钥类,至少需要比您拥有更多的equalshashCode) - 或者,如果您正在做一切顺序编号,只是一个数组:V vals[]

0

对于您放入地图的每个条目,您必须实例化该键,否则您的最后一个条目将被覆盖。

相关问题