如何在Java中“加入”Hashtables?

时间:2010-04-21 18:08:21

标签: java

我有两个字符串:

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

字符串中的数字并不重要。那么用户将选择加入的内容:

一个hashjoin A.a1 = B.b5 B

我想我把A.a1中的A放入哈希表作为键,然后迭代B?键将是用户想要加入的键,数据将在字符串中显示。

2 个答案:

答案 0 :(得分:2)

您确定要加入哈希表吗?也许你的数据结构错误了?

查看java.util.Set(和java.util.HashSet)。如果你想要两个表中的项目,那么这是一个简单的Set操作,如下所示:

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类(对于您的确切情况,您应该比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的等连接。

哈希表是地图,这意味着它们在一个“域”中有一个元素,可用于在另一个“域”中查找元素。在哈希表中,第一个域是键集,第二个域是值集。把它想象成一堆标签和一堆物品。如果要执行equi-join,它必须像元素一样加入。这意味着它将一个键连接到另一个键,或者它将一个值连接到另一个值。

对于键:

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());

加入哈希表本身是没有意义的;因为,一个“匹配”值可能存在于两个哈希表中,但可以由两个不同的键引用。同样,在两个不同的哈希表中找到的一个“匹配”键可能不会引用相同的值。

答案 1 :(得分:1)

你的问题没有多大意义。哈希表(或哈希表)将数据存储为keysvalues。你没有说过哪些值应该是键,哪些值应该是值。