2012-07-03 245 views
1

我想要得到的特定key.But即時得到只有一個值的所有值(倍數)的Java哈希表?我不知道如何打印所有values.Great幫助,如果有人糾正code..did沒有得到谷歌搜索任何幫助..與衝突解決

import java.util.*; 


public class hashing 
{ 
    public static void main(String args[]) 
    { 
     String[] ary=new String[4]; 
     String key; 
     char[] chrary; 
     ary[0]=new String("abcdef"); 
     ary[1]=new String("defabc"); 
     ary[2]=new String("ghijkl"); 
     ary[3]=new String("jklghi"); 
     Hashtable<String, String> hasht = new Hashtable<String, String>(); 
     for(int i=0;i<4;i++){ 
      chrary=ary[i].toCharArray(); 
      Arrays.sort(chrary); 
      key=new String(chrary); 
      hasht.put(key,ary[i]); 
     } 
     Enumeration iterator = hasht.elements(); 
    while(iterator.hasMoreElements()) { 
     String temp = (String)iterator.nextElement(); 
     System.out.println(temp); 
    } 

} 
} 

PS:輸出defabc jklghi.I想ABCDEF defabc ghijkl jklghi。

回答

8

散列表只能包含一個每個鍵的值。要存儲多個值,您應該要麼

  1. 爲每個密鑰存儲集合(例如List<String>或數組)。請注意,您必須集合初始化與該鍵對應
  2. 使用MultiMap

注意,許多多重映射實現存在的第一個值插入之前。甲骨文的文檔提供了一個簡單的實現過(見here,並搜索Multimap之

+0

已將您的鏈接更新至...以及不指向Guava v3的文檔現在在v12上時。 –

4

方式HashMaps這樣的工作是有隻有一個給定的鍵值。因此,如果您致電:

map.put(key, value1); 
map.put(key, value2); 

第二行將覆蓋對應於該鍵的值。

關於你對碰撞的評論,它意味着不同的東西。在內部,HashMap將key/value對存儲在基於密鑰哈希碼定義的桶中(因此名稱爲hashmap)。在兩個不相等的密鑰具有相同的哈希碼的情況下(哈希碼功能很好的情況下爲低概率),實現需要確保查詢其中一個密鑰的哈希映射將返回正確的值。這就是需要處理散列衝突的地方。

+0

在技術上不真實, Woot4Moo

+0

@ Woot4Moo迂迴地,也是不真實的。列表可以被認爲是一個單一的值。 – millimoose

+0

但是,然後我看到一個教程,它說哈希表使用單獨的鏈接來解決衝突... – Dhatri

0

如果密鑰相同,則會更新該值。 JVM會不會把新的鍵/值對相同的鍵...

0

Hashtable<String, String>一個字符串映射到一個字符串。因此put將替換鏈接到特定鍵之前的值。

如果需要多個值,你可以做一個Hashtable<String, []String>Hashtable<String, List<String>>

一個清潔的解決方案是使用谷歌的Multimap它允許多個值到一個鍵相關聯:

類似的地圖收藏,但它可以 與單個鍵關聯多個值。如果您使用相同的密鑰( 不同的值)調用put(K,V)兩次,則multimap包含從密鑰到 值的映射。

0

你只把每個鍵一個字符串:

hasht.put(key,ary[i]); 

所以,如果我= 1,則意味着你把defabc ,你爲什麼期望獲得同一個鍵的多個值?

+0

我讀了一個教程,哈希表使用單獨的鏈接衝突解決.. – Dhatri

+0

只需閱讀您的文章的所有答案,你會得到它。 – Tomer

2

這不是衝突解決方案的意圖。碰撞分辨率讓你處理這種情況,當兩個物體與不同的鍵會進入哈希映射中相同的「桶」。這個解決方案如何發生是哈希映射實現的內部細節,而不是會暴露給你的東西。

0

散列表,像所有地圖一樣,每個鍵只保留一個值,這是您設置的最後一個值。

如果要保留所有值,只需打印原始數組。

String[] ary = "abcdef,defabc,ghijkl,jklghi".split(","); 
System.out.println(Arrays.toString(ary)); 

打印

[abcdef, defabc, ghijkl, jklghi] 
1

其實,你的情況,它不是碰撞,它與相同的hashCode相同的密鑰。通常碰撞發生只有當兩個不同的密鑰產生相同的散列碼時,這可能是由於方法的實施不好造成的。

是的,java.util.HashMap將處理散列衝突,如果你看看HashMap的源代碼,它將每個值存儲在LinkedList。這意味着,如果兩個具有相同散列碼的不同密鑰進入..那麼這兩個值將進入相同的存儲桶,但是存在於linked list中的兩個不同節點。

發現這個link在線,它解釋了哈希映射如何工作的細節。