2014-06-22 19 views
1

Hashtable中分離鏈:基於下面的代碼片段在Java中

Hashtable balance = new Hashtable(); 
    Enumeration names; 
    String str; 
    double bal; 

    balance.put("Zara", new Double(3434.34)); //first entry for Zara 
    balance.put("Mahnaz", new Double(123.22)); 
    balance.put("Zara", new Double(1378.00)); //second entry for Zara 
    balance.put("Daisy", new Double(99.22)); 
    balance.put("Qadir", new Double(-19.08)); 

    System.out.println(balance.entrySet()); 

Output : [Qadir=-19.08, Mahnaz=123.22, Daisy=99.22, Zara=1378.0] 
  1. 爲什麼不鏈接在這裏發生?當我重新與Zara一起輸入密鑰時,舊值被覆蓋。我預計它在鏈表在扎拉」 .hashcode末尾添加()指數。
  2. 不使用Java的鏈接分開僅用於衝突解決?
  3. 如果我不能使用鏈接(如我「v上面試過)請提出一個通用的方法來做到這一點。
+0

閱讀Hashtable的文檔,瞭解它如何處理重複。 –

+1

首先不要使用'Hashtable',第二次使用泛型如下:'HashMap ' – Zarathustra

+0

1.它不是你正在猜測的鏈接,2。是,3。 –

回答

4

確實Java的使用單獨的鏈接僅用於衝突解決?

是的,你只能在每個關鍵的一個條目Hashtable(或HashMap,這是你應該使用的 - 和泛型一起)。這是一個鍵/值映射,而不是一個鍵/多值映射。在散列表的上下文中,術語「衝突」通常用於兩個不相等的密鑰具有相同散列碼的情況。他們仍然需要被視爲不同的密鑰,所以實施必須與此相對應。這不是你所處的情況。

這聽起來像你可能想要一個多地圖,如Guava中的一個。然後,您可以詢問多圖的全部與特定鍵相關的值。

編輯:如果你想建立自己的排序multimap中,你會碰到這樣的:

// Warning: completely untested 
public final class Multimap<K, V> { 
    private final Map<K, List<V>> map = new HashMap<>(); 

    public void add(K key, V value) { 
     List<V> list = map.get(key); 
     if (list == null) { 
      list = new ArrayList(); 
      map.put(key, list); 
     } 
     list.add(value); 
    } 

    public Iterable<V> getValues(K key) { 
     List<V> list = map.get(key); 
     return list == null ? Collections.<V>emptyList() 
          : Collections.unmodifiableList(list); 
    } 
} 
+0

那麼碰撞處理是如何發生的呢?如果再次散列相同的密鑰,我會丟失以前的數據! – Dubby

+0

@Dubby:是的,如記錄。哈希表中的「衝突」是用兩個具有相同哈希代碼的不相等的密鑰來處理的,而你只是得到了相同的密鑰......在這一點上,先前的條目被替換,如文件所述。 –

+0

您能否指出我無法在代碼方面丟失數據?我理解這個理論,但是我仍然對如何去實現它有所損失 – Dubby

3

報價從the documentation of Map(這是哈希表的實現):

的將鍵映射到值的對象。 地圖不能包含重複的鍵;每個鍵可以映射到最多一個值。

(重點煤礦)

documentation of put()還說:

如果映射以前包含該鍵的映射關係,則舊值由指定的值替換

所以如果你想要一個關鍵字的多個值,使用Map<String, List<Double>>而不是Map<String, Double>。番石榴也有一個Multimap,它可以做你想要的,而不必像Map<String, List<Double>>那樣處理列表。

相關問題