2010-04-21 79 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