java - 在 Java 中使用 map 时出现意外/未定义的结果

标签 java dictionary set cosine-similarity keyset

我正在做一些尝试推荐文档的工作,为此我使用了余弦相似度方法。以下是该方法的代码:

static double cosineSimilarity(HashMap<String, Double> v1, HashMap<String, Double> v2) 
{
    Set<String> both = v1.keySet();
    both.retainAll(v2.keySet());
    double sclar = 0, norm1 = 0, norm2 = 0;
    for (String k : both) 
    {
      sclar += v1.get(k) * v2.get(k);
    }
    for (String k : v1.keySet())
    {
      norm1 += v1.get(k) * v1.get(k);
    }
    for (String k : v2.keySet()) 
    {
      norm2 += v2.get(k) * v2.get(k);
    }
    return sclar / Math.sqrt(norm1 * norm2);
}

问题是结果会根据参数传递的顺序而变化。例如,如果我调用 cosineSimilarity(v1, v2) 它将返回 0.3 但如果我调用 cosineSimilarity(v2, v1) 它将返回完全不同的值(value)。

我认为这与 Map.keySet() 返回由 map 支持的集合这一事实有关,但我不完全理解其含义。

有人能看出这个方法哪里出了问题吗?

最佳答案

尝试

Set<String> both = new HashSet<String>(v1.keySet());

而不是

Set<String> both = v1.keySet();

您不应该修改从 keySet 方法获得的集合,因为 map 使用它,并且当您从中删除元素时(在您的情况下是通过 retainAll ),元素也会从 map 。示例:

Map<Integer, Integer> mp = new HashMap<Integer, Integer>();
mp.put(1, 1);
System.out.println(mp); // output {1=1}
mp.keySet().remove(1);
System.out.println(mp); // output {}

关于java - 在 Java 中使用 map 时出现意外/未定义的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14072181/

相关文章:

java - JVM 在 6.0_26-b03 中崩溃

java - 使用 RandomAccessFile 在 Java 中通过多线程下载不正确的文件

java - 修复 StackedbarChart 中任意数量输入的条形图宽度和条形之间的间距

python - 值为字典 : trying to sum across those keys in python 的字典

python - 如何将python中的列表列表组合成字典列表?

python - 在 Python 中计算 n 元重叠矩阵的最快方法

java - 遍历 hastable 键的枚举会引发 NoSuchElementException 错误

python - 在列表列表中比较列表值的最佳方法是什么?

set - autoconf shell 脚本 - "set x"(不带 "-")是什么意思

python - 查找部分子集python