2014-02-09 97 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

對於您放入地圖的每個條目,您必須實例化該鍵,否則您的最後一個條目將被覆蓋。

相關問題