2010-04-21 96 views
0

我有兩個字符串:如何在Java中「加入」哈希表?

A {} 1,2,3,4,5,6 B {} 6,7,8,9,10,11

它不真正的問題是什麼數字在字符串中。所以,那麼用戶會挑加入什麼:

一個hashjoin A.a1 = B.b5乙

我覺得我把阿成一個哈希表由A.a1爲重點,然後遍歷通過B?密鑰將是用戶想要加入的內容,並且數據將成爲字符串中的內容。

+3

什麼是你需要一個散列表映射? – 2010-04-21 18:10:16

+1

更具體的你想要做什麼樣的映射('Hashtable'實現'Map '接口) – Progman 2010-04-21 18:11:27

+0

對不起,讓我澄清一下,我將有兩個數字串代表兩個關係A和B.我會結束散列通過用戶指定的連接屬性加入它們。但我不完全確定如何做一個哈希連接,該表是由連接屬性創建的關鍵? – 2010-04-21 18:13:43

回答

1

你的問題沒有多大意義。散列表(或散列表)將數據存儲爲keysvalues。你沒有提到哪些值應該是關鍵字,哪些值應該是值。

2

你確定你想加入哈希表嗎?也許你有錯誤的數據結構?

調查java.util.Set(和java.util.HashSet)。如果您想獲得這兩個表中的項目,那麼它是一組簡單的操作,像這樣:

Collection A = new ... 
...fill the A up... 
Collection B = new ... 
...fill the B up... 
Set join = new HashSet(); 
join.addAll(A); 
join.retainAll(B); 

如果你的意思是更像是一個SQL表時,則輸出將取決於什麼類型的連接你的意思的執行,以及等號在這種情況下意味着什麼。注意,你必須寫一個Pair類(你應該做比對的詳細描述你的具體情況)

對於一個完整的加盟:

ArrayList pairs = new ArrayList(); 
for (Number numberA : A) { 
    for (Number numberB : B) { 
    pairs.add(new Pair(numberA, numberB)); 
    } 
} 

對於一個充滿where子句聯接:

ArrayList pairs = new ArrayList(); 
for (Number numberA : A) { 
    for (Number numberB : B) { 
    if (check the condition of the where clause here) { 
     pairs.add(new Pair(numberA, numberB)); 
    } 
    } 
} 

這是一個很好的答案,可以在這種情況下給出,因爲你的問題不是很具體。如果這些一般答案不能幫助你,那麼你需要更詳細地解釋你的問題,以得到更詳細的答案。

---首先編輯,澄清後---

好了,所以這是一個類似於SQL的相等聯接。

哈希表是地圖,這意味着它們在一個「域」中有一個元素,可用於查找另一個「域」中的元素。在散列表中,第一個域是鍵集,第二個域是值集。把它想象成一堆標籤和一堆物品。如果要執行等連接,它必須像元素一樣連接。這意味着它會將一個鍵連接到另一個鍵,或者將一個鍵連接到另一個鍵。

鑰匙:

Hashtable A = ... 
Hashtable B = ... 

Set keyJoin = new HashSet(); 
keyJoin.addAll(A.keySet()); 
keyJoin.retainAll(B.keySet()); 

對於值:

Hashtable A = ... 
Hashtable B = ... 

Set valueJoin = new HashSet(); 
valueJoin.addAll(A.values()); 
valueJoin.retainAll(B.values()); 

它沒有意義加入哈希表本身;因爲一個「匹配」值可能存在於兩個哈希表中,但可以由兩個不同的密鑰來引用。同樣,在兩個不同的哈希表中找到的一個「匹配」鍵可能不會引用相同的值。

+0

它是一個使用散列的兩個關係的等連接 – 2010-04-21 19:35:01

+0

注意這個工作,標準的Java規則適用。您需要檢查以確保Keys和Values正確實施「public boolean equals(Object other)」。 – 2010-04-21 20:07:47