为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕沐林林 2022-06-30 11:28:53
我用 Java 编写了一个程序,它从数据库表中检索记录并将它们存储在哈希图中。它们的键和值如下所示:Key(represent words)      Values(represent filename)w1                          file1w2                          file1w3                          file2w4                          file1w5                          file2w6                          file1,file2............列表还在继续,但这只是它的外观的一个想法。如您所见,单词没有重复,它们是独一无二的。鉴于我有这个哈希图信息,我需要找到键的交集和它的下一个键并返回交集的结果。这个想法看起来像这样:w1∩w2= file1w2∩w3= emptyw3∩w4= empty........它会一直运行,直到完成 hashmap 中的最后一对键。由于这对交集结果取决于哈希图中的键数,我猜我需要使用一些循环来保持它迭代以返回所有结果。有没有一种方法可以获取每个后续键的交集,也有一种方法可以优化而不考虑哈希图的大小?我很感激任何建议。
查看完整描述

2 回答

?
当年话下

TA贡献1890条经验 获得超9个赞

创建一个变量来保存所有这些交叉点。在您的循环中一次检索 2 个键。比较 2 个键的每个值,如果它们相同,则将该值添加到您的交叉点持有人。重复这些步骤,直到不再有对。


这是代码。


在你的 try/catch 下添加这个


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;

}


查看完整回答
反对 回复 2022-06-30
?
jeck猫

TA贡献1909条经验 获得超7个赞

另一个带有集合操作的版本:


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;

}


查看完整回答
反对 回复 2022-06-30
  • 2 回答
  • 0 关注
  • 155 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号