我目前正在使用 2 个 for 循环来比较所有条目,但我得到了重复的比较。因为 HashMap 没有排序,所以我不知道如何消除已经进行的比较。例如,我有类似的东西:
for(Entry<String, String> e1: map.entrySet())
{
for(Entry<String, String> e2: map.entrySet())
{
if (e1.getKey() != e2.getKey())
{
//compare e1.getValue() to e2.getValue()
}
}
}
这样做的问题是,第一个条目将与第二个条目进行比较,然后与第三个条目进行比较,依此类推。但随后第二个条目将再次与第一个条目进行比较,依此类推。然后第三个条目将与第一个条目进行比较,然后是第二个条目,然后是第四个条目,依此类推。是否有更好的方法来迭代 HashMap 以避免重复比较?
附加信息:
更具体地说,希望回答您的问题,我的 HashMap 存储文件名(键)和文件内容(值) - 只是文本文件。 HashMap 已通过遍历包含我要比较的文件的目录来填充。然后我正在做的是通过一些算法运行文件对来确定每对文件之间的相似性。我不需要将文件 1 与文件 2 进行比较,然后再次将文件 2 与文件 1 进行比较,因为我只需要对 2 个文件进行一次比较。但我确实需要将每个文件与其他文件进行一次比较。我对使用 HashMap 是全新的。 agim 下面的答案可能只适合我的目的。但我也会尝试思考下面 Evgeniy Dorofeev 和 Peter Lawrey 的解决方案。我希望这有助于更好地解释事情。
如果您不小心,消除重复项的成本可能至少高于对键进行冗余比较的成本。
您可以使用以下命令订购密钥System.identityHashCode(x)
for(Map.Entry<Key, Value> entry1: map.entrySet()) {
Key key1 = entry1.getKey();
int hash1 = System.identityHashCode(key1);
Value value1 = entry1.getValue();
for(Map.Entry<Key, Value> entry2: map.entrySet()) {
Key key2 = entry2.getKey();
if (key1 > System.identityHashCode(key2)) continue;
Value value2 = entry1.getValue();
// compare value1 and value2;
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)