java-如何在循环中的Hashset中找到值的交集?

时间:2019-02-21 07:04:47

标签: java

我用Java编写了一个程序,该程序从数据库表中检索记录并将它们存储在哈希图中。

它们的键和值如下:

Key(represent words)      Values(represent filename)

w1                          file1
w2                          file1
w3                          file2
w4                          file1
w5                          file2
w6                          file1,file2
............

这个列表不停地在不断,但这只是它的外观而已。您可以看到,单词没有重复,而且是唯一的。

鉴于我有此哈希图信息,我需要找到键和下一个键的交点并返回交点的结果。这个主意看起来像这样:

w1∩w2= file1
w2∩w3= empty
w3∩w4= empty

....并且一直持续到哈希表中的最后一对密钥完成为止。

由于这对交集的结果取决于哈希图中的键的数量,所以我猜我需要使用一些循环来使其迭代以返回所有结果。

是否有一种方法来获取每个后续​​键的交集,并且有一种无论哈希图大小如何都可以优化的方法?

我很感谢任何建议。

2 个答案:

答案 0 :(得分:1)

制作一个变量,以保存所有这些交点。在循环中一次检索2个键。比较两个键的每个值,如果它们相同,则将值添加到您的交集持有人。重复这些步骤,直到没有更多的配对为止。

这是代码。

将此添加到您的尝试/捕获下方

LinkedHashmap<String, Set<String>> intersectionMap = new LinkedHashmap<>();
if (map.keySet() != null) {
    String[] keys = map.keySet().toArray(new String[map.keySet().size()]);
    for (int i = 0; i < keys.length - 1; i++) {
        String key1 = keys[i];
        String key2 = keys[i + 1];
        TreeSet<String> interSection = intersection(map.get(key1), map.get(key2));
        intersectionMap.put(key1 + "∩" + key2, interSection);
    }
}

添加此帮助程序方法。此方法将找到两个集合的交集。这将是解决问题的关键。

public static TreeSet<String> intersection(TreeSet<String> setA, TreeSet<String> setB) {
    // An optimization to iterate over the smaller set
    if (setA.size() > setB.size()) {
        return intersection(setB, setA);
    }
    TreeSet<String> results = new TreeSet<>();
    for (String element : setA) {
        if (setB.contains(element)) {
            results.add(element);
        }
    }
    return results;
}

答案 1 :(得分:0)

又一个具有设置操作的版本:

Map<String>, Set<String>> intersections(Map<String, TreeSet<String>> map) {
    Map<String>, Set<String>> result = new TreeMap<>();

    List<String> words = new ArrayList<>(map.keySet());
    words.sort();
    for (int i = 0; i < words.size() - 1; ++i) {
        String wordI = words.get(i);
        Set<String> valueI = map.get(wordI);
        for (int j = i + 1, j < words.size(); ++j) {
            String wordJ = words.get(j);
            Set<String> valueJ = map.get(wordJ);

            String word = wordi + "∩" + words[j];
            Set<String> value = new TreeSet<>(valueI);
            value.retainAll(valueJ);
            result.put(word, value);
        }
    }
    return result;
}