我最近遇到了一个很好的问题, 我有一张地图
LinkedHashMap<String, List<MyCustomObject>>
我需要将它与另一个Map进行比较,其中将使用完全相同的方法填充数据库中的数据是相同的。
真正发生的是,我在时间0填充map1,并在时间t填充map2,使用相同的java方法(当我这样说时,我的意思是使用相同的DB /表等) 因此,如果数据库端的数据相同,那么这两个映射应该具有相同的内容,顺序相同(希望!!)
现在我想比较这两个地图,如果它们不相等(即从数据库中取出一些新数据),那么我想做一些动作。如果它们是相同的,我只想把它留下来这一点。
有人能指出我会帮助我理解如何做到这一点吗?
序列化是否能解决这个问题?
谢谢, Neeraj
答案 0 :(得分:4)
只需使用equals
:
if (!map1.equals(map2)) {
//they differ
}
您必须在equals
上实施hashCode
(以及MyCustomObject
!),因为(如果我理解正确的话)对象将具有相同的内容但身份不同(默认{ {1}}只是比较指针 - 即对象所在的内存地址。)
答案 1 :(得分:2)
确保您的MyCustomObject
类实施适当的equals
和hashcode
方法,然后就像获取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");
}