2011-06-16 104 views
1

伊夫遇到一个很好的问题,最近, 我有一个地图比较的地图,列出了在Java

LinkedHashMap<String, List<MyCustomObject>> 

我需要与此相比,另一个地图,将在完全相同的方法来填充的数据在DB中是一样的。

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

现在我想比较这两个地图,如果他们不相等(即一些新的数据是从数据库中提取的),然后我想要做一些动作。如果它们是相同的,我只想离开它。

有人可以指出我是否可以帮助我了解如何做到这一点?

是序列化的答案吗?

感谢, Neeraj

+1

你想知道差异还是只想知道两者是否有所不同? – 2011-06-16 12:15:39

+0

我只是想知道他们是否有差异。 – Neeraj 2011-06-16 12:16:06

+0

Java序列化不是答案。 'equals'有什么问题? – 2011-06-16 12:18:44

回答

4

只需使用equals

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

你将不得不实施equalsMyCustomObject,因为(如果我理解正确的话)的对象将具有相同(和hashCode!)内容但身份不同(默认equals只比较指针 - 即对象所在的内存地址)。

2

确保您MyCustomObject类实现一个适当的equalshashcode方法,然后它作为获取的map1.equals(map2)结果一样简单。

这就是javadocs不得不说一下吧:

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

1

其他答案很好,下面的例子说明了map函数遍历键和值(以及比较列表中的项)进行等式比较。正如他们所说,你将需要重写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"); 
}