我知道你可以将任何东西传递给带有对象的方法。我正在尝试编写一个断言函数来检查两个映射是否相等。我不能只使用map1.equals(map2),因为即使它们具有所有相同的键和值,它们也可能处于不同的顺序。所以我想通过第一张地图中的关键字获取其值并将其与第二张地图中该关键字的值进行比较。而且我想一般地这样做。所以我写了这个(这是一个存根来证明我的问题。我会做更多的空检查等):
public void assertMapEquals( Map<Object, Object> f, Map<Object, Object> l) {
// This will do null checks, don't worry
for ( Entry<Object, Object> ent : f.entrySet()) {
if (f.size() != l.size()) {
throw new AssertionError ("size mismatch");
}
Object k = ent.getKey();
Object e = ent.getValue();
Object a = l.get(k);
if (!e.equals(a)) {
throw new AssertionError( "unequal");
}
}
}
然后我尝试用两个String贴图调用它:
public static void main(String[] argv) throws SQLException {
Map<String,String> m1 = new HashMap<>();
Map<String,String> m2 = new HashMap<>();
// Data will get filled in later
assertMapEquals(m1, m2);
// ...
}
但是Eclipse在调用时给出了以下错误:
方法assertMapEquals(Map,Map)in MyMain1类型不适用于参数 (地图,地图)
Aren没有把对象串起来,所以为什么要赢得这项工作,我该怎么办?此问题可以应用于此类任何示例,而不仅仅是比较两个地图。
我想要的另一个问题是,在比较但不关心订单的情况下,我可以采用更好的方式做到这一点吗?
答案 0 :(得分:2)
您可以使用<?, ?>
(而非<K, V>
参数化的通用方法,因为正如评论中所提到的,它们可能属于不同的类型并且仍然相同,例如Map<String, String>
vs {{ 1}}):
Map<Object, Object>
另一种方法是直接比较地图:
public static void assertMapEquals(Map<?, ?> f, Map<?, ?> l) {
if (f == null || l == null)
throw new NullPointerException();
if (f.size() != l.size())
throw new AssertionError ("size mismatch");
for (Entry<?, ?> ent : f.entrySet()) {
Object k = ent.getKey();
Object e = ent.getValue();
Object a = l.get(k);
if (!Objects.equals(e, a)) // handle null values
throw new AssertionError("unequal");
}
}
按合同,public static void assertMapEquals(Map<?, ?> f, Map<?, ?> l) {
if (f == null || l == null)
throw new NullPointerException();
if (f.size() != l.size())
throw new AssertionError("size mismatch");
if (!f.equals(l))
throw new AssertionError("unequal contents");
}
如果Map#equals(Object o)
为o
且内容相同,则返回true。