加入两个Hashtables最优雅的方式是什么?
我有这个HashTable,我不能使用数组或列表或集合,因为它混淆了处理自定义类。至少这就是我的想法。
**Hashtable<ItemSet, Integer> frequentItemSetL1 = new Hashtable<>();**
for (Map.Entry<ItemSet, Integer> entry : candidateItemSetC1.entrySet()) {
if (entry.getValue() >= supportThreshold) {
frequentItemSetL1.put(entry.getKey(), entry.getValue());
}
包含: 键 - 值对。
看起来像这样:
{1}, 3
{2}, 23
{3}, 7
{4}, 18
.....
我需要 frequentItemSetL1 的KEYS加入THEMSELVES;
结果应该是:
{1, 2}
{1, 3}
{1, 4}
{2, 3}
{2, 4}
{3, 4}
我尝试了两个for循环和KeySet,但没有走得太远。可能需要一些新鲜的想法。
试过这个:
for (int i = 0; i < frequentItemSetL1.size(); i++) {
Integer item1 = frequentItemSetL1.get(i);
for (int j = i + 1; j < frequentItemSetL1.size(); j++) {
Integer item2 = frequentItemSetL1.get(j);
// Create a new candidate by combining itemset1 and itemset2
candidateItemSetC2.put(item1, item2);
}
答案 0 :(得分:0)
由于没有人能够提供帮助,只是为了澄清和帮助他人,我所寻找的是:
List<ItemSet> candidateItemSetC2 = new ArrayList<>();
Hashtable<ItemSet, Integer> frequentItemSetL2 = new Hashtable<>();
// For each itemset I1 and I2 of level k-1
for (ItemSet is : frequentItemSetL1.keySet()) {
for (ItemSet is2 : frequentItemSetL1.keySet()) {
if (is.equals(is2)) {
continue;
}
if (is.set.length != is2.set.length) {
continue;
}
boolean shouldJoin = true;
for (int i = 0; i < is.set.length - 1; i++) {
if (is.set[i] != is2.set[i]) {
shouldJoin = false;
}
}
if (shouldJoin == false) {
continue;
}
int[] join = new int[is.set.length + 1];
for (int i = 0; i < is.set.length; i++) {
join[i] = is.set[i];
}
join[join.length - 1] = is2.set[is2.set.length - 1];
Arrays.sort(join);
ItemSet joinedSet = new ItemSet(join);
if (!candidateItemSetC2.contains(joinedSet)) {
candidateItemSetC2.add(joinedSet);
}
for (int p = 0; p < candidateItemSetC2.size(); p++) {
//System.out.print(candidateItemSetC2.get(p));
}
}