java中地图与列表的比较
我最近遇到了一个好问题, 我有一张地图java中地图与列表的比较,java,comparison,hashmap,Java,Comparison,Hashmap,我最近遇到了一个好问题, 我有一张地图 LinkedHashMap<String, List<MyCustomObject>> LinkedHashMap 我需要将其与另一个映射进行比较,如果数据库中的数据相同,则将使用完全相同的方法填充该映射 真正发生的是,我在时间0填充map1,在时间t填充map2,使用相同的java方法(当我这么说时,我的意思是使用相同的DB/表等) 因此,如果数据库端的数据相同,那么这两个映射应该具有相同的内容,顺序相同(希望如此!!) 现
LinkedHashMap<String, List<MyCustomObject>>
LinkedHashMap
我需要将其与另一个映射进行比较,如果数据库中的数据相同,则将使用完全相同的方法填充该映射
真正发生的是,我在时间0填充map1,在时间t填充map2,使用相同的java方法(当我这么说时,我的意思是使用相同的DB/表等)
因此,如果数据库端的数据相同,那么这两个映射应该具有相同的内容,顺序相同(希望如此!!)
现在我想比较这两个映射,如果它们不相等(即从数据库中获取了一些新数据),那么我想做一些操作。如果它们相同,我只想保持这样
有人能给我指点一下图坦卡门,让我明白怎么做吗
序列化是这个问题的答案吗
谢谢,
Neeraj只需使用
equals
:
if (!map1.equals(map2)) {
//they differ
}
您必须在
MyCustomObject
上实现equals
(和hashCode
!),因为(如果我理解正确的话)对象将具有相同的内容但不同的标识(默认的equals
只是比较指针-即对象所在的内存地址).只要使用等于
:
if (!map1.equals(map2)) {
//they differ
}
您必须在
MyCustomObject
上实现equals
(和hashCode
!),因为(如果我理解正确的话)对象将具有相同的内容但不同的标识(默认的equals
只是比较指针-即对象所在的内存地址)
这是他们必须说的:
将指定的对象与
这是平等的地图。如果
给定的对象也是一个映射和
两个映射表示相同的映射。
更正式地说,两个映射t1和t2
表示相同的映射,如果
t1.entrySet().equals(t2.entrySet())。
这确保了equals方法
在不同的环境中正常工作
映射接口的实现
确保您的
MyCustomObject
类实现了适当的equals
和hashcode
方法,这样就很容易得到map1.equals(map2)
的结果
这是他们必须说的:
将指定的对象与
这是平等的地图。如果
给定的对象也是一个映射和
两个映射表示相同的映射。
更正式地说,两个映射t1和t2
表示相同的映射,如果
t1.entrySet().equals(t2.entrySet())。
这确保了equals方法
在不同的环境中正常工作
映射接口的实现
其他答案很好,这里有一个例子,确实,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");
}
静态公共列表getStringList(字符串…arg){
ArrayList ArrayList=新的ArrayList();
对于(int x=0;x来说,其他答案都很好,下面是一个例子,事实上,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");
}
静态公共列表getStringList(字符串…arg){
ArrayList ArrayList=新的ArrayList();
对于(int x=0;xd)您想知道两者的区别吗?还是只是想知道两者是否不同?我只是想知道它们是否不同。Java序列化不是答案。equals
有什么问题?调用equals会不会考虑遍历列表(每个键的值)同时迭代所有的键,并同时进行比较??首先要确保从数据库中提取记录,以确保映射是有序的。如果是这样,你的LinkedHashMap将根据本问题中引用的javadocs是有序的:你想知道不同点吗或者你只是想知道两者是否不同?我只是想知道它们是否不同。Java序列化不是答案。equals
有什么问题吗?调用equals是否需要遍历列表(每个键的值)同时迭代所有键,同时进行比较??首先必须确保从数据库中提取记录,以确保映射有序。如果是这种情况,则LinkedHashMap将根据本问题中引用的javadocs有序: