当前位置: 首页 > 面试题库 >

比较两个地图

钦德佑
2023-03-14
问题内容

我有两个地图声明为Map<String, Object>。在Object这里可以是另一个Map<String, Object>(依此类推)。我想检查两个地图是否完全相同,但不知道其深度。除了使用递归,我还可以比较toString()每个地图上被调用的输出吗?还是有比较简单的方法比较地图?


问题答案:

快速回答

您应该使用该equals方法,因为已经实现了该方法以执行所需的比较。toString()本身就像使用迭代器一样,equals但这是一种效率较低的方法。另外,正如@Teepeemm所指出的那样,toString它受元素顺序的影响(基本上是迭代器的返回顺序),因此不能保证为2个不同的映射提供相同的输出(尤其是如果我们比较两个不同的映射)。

注意/警告
:您的问题和我的回答都假设实现map接口的类尊重预期toStringequals行为。默认的Java类会这样做,但是需要检查自定义映射类以验证预期的行为。

参见:http :
//docs.oracle.com/javase/7/docs/api/java/util/Map.html

boolean equals(Object o)

比较指定对象与此映射是否相等。如果给定对象也是一个映射并且两个映射 表示相同的映射, 则返回true 。更正式地说,
如果m1.entrySet()。equals(m2.entrySet()) ,则 两个映射m1和m2表示相同的映射
。这样可确保equals方法可在Map接口的不同实现中正常工作。

Java源代码中的实现(java.util.AbstractMap)

另外,java本身负责遍历所有元素并进行比较,因此您不必这样做。看一下AbstractMap类使用的实现HashMap

 // Comparison and hashing

    /**
     * Compares the specified object with this map for equality.  Returns
     * <tt>true</tt> if the given object is also a map and the two maps
     * represent the same mappings.  More formally, two maps <tt>m1</tt> and
     * <tt>m2</tt> represent the same mappings if
     * <tt>m1.entrySet().equals(m2.entrySet())</tt>.  This ensures that the
     * <tt>equals</tt> method works properly across different implementations
     * of the <tt>Map</tt> interface.
     *
     * <p>This implementation first checks if the specified object is this map;
     * if so it returns <tt>true</tt>.  Then, it checks if the specified
     * object is a map whose size is identical to the size of this map; if
     * not, it returns <tt>false</tt>.  If so, it iterates over this map's
     * <tt>entrySet</tt> collection, and checks that the specified map
     * contains each mapping that this map contains.  If the specified map
     * fails to contain such a mapping, <tt>false</tt> is returned.  If the
     * iteration completes, <tt>true</tt> is returned.
     *
     * @param o object to be compared for equality with this map
     * @return <tt>true</tt> if the specified object is equal to this map
     */
    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;
    }

比较两种不同类型的地图

toString比较a时失败TreeMapHashMapequals正确地比较了内容。

码:

public static void main(String args[]) {
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("2", "whatever2");
map.put("1", "whatever1");
TreeMap<String, Object> map2 = new TreeMap<String, Object>();
map2.put("2", "whatever2");
map2.put("1", "whatever1");

System.out.println("Are maps equal (using equals):" + map.equals(map2));
System.out.println("Are maps equal (using toString().equals()):"
        + map.toString().equals(map2.toString()));

System.out.println("Map1:"+map.toString());
System.out.println("Map2:"+map2.toString());
}

输出:

Are maps equal (using equals):true
Are maps equal (using toString().equals()):false
Map1:{2=whatever2, 1=whatever1}
Map2:{1=whatever1, 2=whatever2}


 类似资料:
  • 问题内容: 在Java中,我想比较两个地图,如下所示,我们是否有现有的API可以做到这一点? 谢谢 问题答案: 我将使用Set的removeAll()功能来设置键的差异,以查找添加和删除的内容。可以通过使用设置为HashMap的条目进行设置差异来检测实际更改。Entry同时使用键和值实现equals()。 输出量

  • 问题内容: 如何通过两个地图的值比较?我有两个包含相等值的地图,并希望通过它们的值进行比较。这是一个例子: 我应该如何更改代码以获取真实信息? 问题答案: 您尝试使用串联构造不同的字符串将失败,因为它是在编译时执行的。这些地图都有一对。每对将使用相同的字符串引用将“ foo”和“ barbar”作为键/值。 假设您确实要比较值集而不需要任何键的引用,则只是以下一种情况: 这 可能 是比较有将工作-

  • 在爪哇中。如果我们必须将一个对象与另一个对象进行比较。我们比较该对象中的每个字段。 学生 1 对象具有标记 1、标记 2、标记 3、名称、年龄作为字段。学生 2 对象具有标记 1、标记 2、标记 3、名称、年龄作为字段。因此,要检查2名学生是否相等...我们比较每个字段。 但是,如果 Student 对象有许多字段,该怎么办?学生1对象有标记1,标记2,标记3,名称,年龄,地址,颜色,类,国家,部

  • 问题内容: 我想知道如何比较两个不同的数据库 表记录 。我的意思是,我将比较两个数据库表,它们可能具有不同的列名但具有相同的数据。但是其中一个表可能比另一个表具有更多的记录,因此我想看看这两个表之间的区别是什么。为此,如何编写sql查询?仅供参考:这两个数据库都在同一个SQL Server实例下。 然后,在比较表1和表2之后,它应该 从 表2返回 Ruby Core。 问题答案: 如果执行从T1到

  • 问题内容: 我有两个。每个大小为100000。我想比较它们并计算匹配的元素。 这是我的代码: 在这里比较过程要花费很多时间。 如何解决和优化此问题。 问题答案: 您应该使用:返回一个包含collection1中所有元素的集合,这些元素也处于collection2中。

  • 问题内容: 我有这个间隔,当前每5秒执行一次ajax请求。我对声明有疑问。我的代码总是输入它,并且两个json值完全相同,为什么它认为它们不同? 编辑 这是控制台输出(虚线是分隔请求,它不在实际输出中) 问题答案: 不能保证以相同的方式序列化JSON对象,也不能保证属性以相同的顺序进行序列化,使用并不是测试对象相等性的好方法。 一个更好的例子是这样的函数(前一段时间在互联网上找到,希望我能感谢原始