gpt4 book ai didi

java - 如何覆盖 的两个映射的 equals ?

转载 作者:太空宇宙 更新时间:2023-11-04 07:11:30 25 4
gpt4 key购买 nike

我有一个类,它有一个 Map 字段(键是字符串,值是已正确实现“等于”方法进行比较的对象)。

我想以仅当映射在键和值之间具有相等映射时才返回 true 的方式重写此类的 equals。

这是我的尝试:

// Assumes that the Object values in maps have correctly implemented the equals method.
private boolean mapsEqual(Map<String, Object> attributes)
{
if (this.attributes_.keySet().size() != attributes.keySet().size() ||
this.attributes_.values().size() != attributes.values().size())
return false;
for (String key : attributes.keySet()) {
if (!this.attributes_.keySet().contains(key))
return false;
if (!this.attributes_.get(key).equals(attributes.get(key)))
return false;
}
return true;
}

但是,当多次添加相同的键或从映射中删除某个键时,此实现会失败(值的大小测试失败,因为它们会计算重复项,并且在删除值时不会调整大小。)

看来我的情况应该很常见,可以找到与我的案例相关的信息,但我找不到任何信息。对于这种情况是否有任何遗留代码或广泛接受的解决方案?任何帮助或工作解决方案表示赞赏。

最佳答案

即使我不能 100% 确定它能解决您的问题(但它根本不适合评论),我仍会将其作为答案。

首先,重复我的评论:Map 接口(interface)禁止映射具有重复的键或每个键有多个值。因此,任何正确的实现(例如 java.util.HashMap)都不允许这样做。通常,如果发生这种情况,他们只会替换该值。

此外,对我来说,equals 的规范似乎正在做你想要的事情。同样,正确的实现必须符合该规范。

那么,这里的重点是什么:如果您正在编写自己的实现 Map 的类,那么它根本不能允许重复的键(像 get 这样的方法将不再有意义)。如果您使用内置实现(例如 HashMap),它无论如何都会替换这些值。

现在您说您遇到了 keySet()values() 的大小问题。我认为您应该添加会导致此行为的示例代码。以下对我来说效果很好:

Map<String, String> map = new HashMap<String, String>();
map.put("Foo", "Bar");

System.out.println(map.keySet().size()); // 1
System.out.println(map.values().size()); // 1

map.put("Foo", "Baz"); // the HashMap will merely replace the old value

System.out.println(map.keySet().size()); // still 1
System.out.println(map.values().size()); // still 1

移除一个键当然会改变大小。根据您到目前为止的解释,我不明白您如何认为这是一个问题。

至于equals,您可能只想看看HashMap的实现,可以在 here中找到它。 :

public boolean equals(Object o) {
if (o == this)
return true;

if (!(o instanceof Map))
return false;
Map<K,V> m = (Map<K,V>) o;
if (m.size() != size())
return false;

try {
Iterator<Entry<K,V>> i = entrySet().iterator();
while (i.hasNext()) {
Entry<K,V> e = i.next();
K key = e.getKey();
V value = e.getValue();
if (value == null) {
if (!(m.get(key)==null && m.containsKey(key)))
return false;
} else {
if (!value.equals(m.get(key)))
return false;
}
}
} catch (ClassCastException unused) {
return false;
} catch (NullPointerException unused) {
return false;
}

return true;
}

考虑以下示例:

Map<String, String> map1 = new HashMap<String, String>();
map1.put("Foo", "Bar");

Map<String, String> map2 = new HashMap<String, String>();
map2.put("Foo", "Bar");

System.out.println(map1.equals(map2)); // true

关于java - 如何覆盖 <String, Object> 的两个映射的 equals ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20580798/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com