2016-10-30 93 views
0

我有100個條目,我必須將這些散列成一個有限大小的散列表。如何使密鑰在Hashtable中具有多個值?

我知道如何使用第一個條目,ht.put(k,v)有竅門。

但是,只要我想給它添加另一個值,舊的就會被覆蓋。我不想那樣做,我想將它追加到鏈表或數組列表中。

Hashtable<Integer,Integer> ht = new Hashtable<Integer,Integer>(211); 

ht.put(1, 40); 
ht.put (1, 60); 

System.out.println(ht.get(1)); 
// output is 60 

如何使40和60都成爲?

+0

@NickBell那一個是不同的。 –

+0

你想要'ht.get(1)'返回什麼? – njzk2

+0

40和60. –

回答

0

您正在使用相同的密鑰(1),這不是您想要的,除非您想向同一個密鑰添加更多值,在這種情況下,請使用散列表HashMap<Integer,List<Integer>> integerArrayMap

在Hashtable中,鍵必須是唯一的,因爲您沒有使用唯一鍵,相同的值將被替換。所以儘量把值與不同的鍵。

ht.put(1, 40); 
ht.put (2, 60); 

我建議你參考Hashtable的API在這裏: https://docs.oracle.com/javase/7/docs/api/java/util/Hashtable.html

2

你可以列出作爲價值型喜歡下最合適的自由空間:

Hashtable<Integer,List<Integer>> ht = new Hashtable<Integer,List<Integer>>(211); 

和你put操作會是什麼樣子:

public static void put(Hashtable<Integer,List<Integer>> ht, int key, int value) { 
    List<Integer> list = ht.get(key); 
    if (list == null) { 
     list = new ArrayList<Integer>(); 
     ht.put(key, list); 
    } 
    list.add(value); 
} 

[UPDATE1] 如果你願意,你可以讓你的一個EXTENS Hashtable中的離子喜歡:

public class MyHashtable extends Hashtable<Integer,List<Integer>> { 
    public MyHashtable(...) { // add params if needed 
     super(...); 
    } 

    // with additional method: 
    public static void putOne(int key, int value) { 
     List<Integer> list = this.get(key); 
     if (list == null) { 
      list = new ArrayList<Integer>(); 
      this.put(key, list); 
     } 
     list.add(value); 
    } 
} 
+0

這意味着我重寫散列表的put方法權利? @rsutormin –

+1

從Java 8開始,您可以在一行內完成:'hashTable.computeIfAbsent(key,k - > new ArrayList ()).add(value);'事實上,[文檔](https: //docs.oracle.com/javase/8/docs/api/java/util/Map.html#computeIfAbsent-K-java.util.function.Function-)就是這個用例的一個例子。 – VGR

+0

@MayurTolani:在我的主要答案中[UPDATE1]回答了你。 – rsutormin

1

你正在尋找的數據結構被稱爲多地圖。根據定義,它具有與地圖不同的界面,因爲它允許與同一個鍵相關聯的多個值。

這個數據結構還沒有標準的庫實現。但是你可以在一些開源庫找到好的:

相關問題