将映射与java中的列表进行比较

时间:2011-06-16 12:12:15

标签: java comparison hashmap

我最近遇到了一个很好的问题, 我有一张地图

 LinkedHashMap<String, List<MyCustomObject>>

我需要将它与另一个Map进行比较,其中将使用完全相同的方法填充数据库中的数据是相同的。

真正发生的是,我在时间0填充map1,并在时间t填充map2,使用相同的java方法(当我这样说时,我的意思是使用相同的DB /表等) 因此,如果数据库端的数据相同,那么这两个映射应该具有相同的内容,顺序相同(希望!!)

现在我想比较这两个地图,如果它们不相等(即从数据库中取出一些新数据),那么我想做一些动作。如果它们是相同的,我只想把它留下来这一点。

有人能指出我会帮助我理解如何做到这一点吗?

序列化是否能解决这个问题?

谢谢, Neeraj

3 个答案:

答案 0 :(得分:4)

只需使用equals

if (!map1.equals(map2)) {
    //they differ
}

您必须在equals上实施hashCode(以及MyCustomObject!),因为(如果我理解正确的话)对象将具有相同的内容但身份不同(默认{ {1}}只是比较指针 - 即对象所在的内存地址。)

答案 1 :(得分:2)

确保您的MyCustomObject类实施适当的equalshashcode方法,然后就像获取map1.equals(map2)的结果一样简单。

这是javadocs对此所说的话:

  

比较指定的对象   这张地图是为了平等。如果,则返回true   给定的对象也是一个地图和   两个地图代表相同的映射。   更正式地说,两个地图t1和t2   代表相同的映射if   t1.entrySet()。等于(t2.entrySet())。   这确保了equals方法   适用于不同的工作   Map接口的实现。

答案 2 :(得分:1)

其他答案都很好,这里有一个例子,确实,地图函数迭代了键和值(并比较列表中的项目)来进行相等比较。正如他们所说,你将需要覆盖hashCode和equals。

static public List<String> getStringList(String... arg) {
    ArrayList<String> arrayList = new ArrayList<String>();
    for(int x=0;x<arg.length;x++) arrayList.add(arg[x]);
    return arrayList;
}

static public void main(String[] arg) {
    LinkedHashMap<String, List<String>> mapA = new LinkedHashMap<String, List<String>>();
    LinkedHashMap<String, List<String>> mapB = new LinkedHashMap<String, List<String>>();
    LinkedHashMap<String, List<String>> mapC = new LinkedHashMap<String, List<String>>();
    mapA.put("same", getStringList("a", "b", "c"));
    mapB.put("same", getStringList("a", "b", "c"));
    mapC.put("same", getStringList("a", "b", "d"));
    System.out.println(mapA.equals(mapB) ? "true" : "false");
    System.out.println(mapA.equals(mapC) ? "true" : "false");
}