Java数组列表不相等,即使它们是
嗨,我有两个Java数组列表不相等,即使它们是,java,arraylist,Java,Arraylist,嗨,我有两个ArrayList,其中存储了HashMap。例如 expectedList = [ { id = 1, key = X, rowid = 1, id = 1, timeofday = 12: 12: 00, stream = A }, { id = 999999999, key = Y, rowid = 2, id = 1, timeofday = 16: 12: 00, stream = A }] tableList = [ { id =
ArrayList
,其中存储了HashMap
。例如
expectedList = [
{
id = 1, key = X, rowid = 1, id = 1, timeofday = 12: 12: 00,
stream = A
},
{
id = 999999999, key = Y, rowid = 2, id = 1, timeofday = 16: 12: 00,
stream = A
}]
tableList = [
{
id = 1, key = X, rowid = 1, id = 1, timeofday = 12: 12: 00,
stream = A
},
{
id = 999999999, key = Y, rowid = 2, id = 1, timeofday = 16: 12: 00,
stream = A
}]
expectedFileList.equals(tableList)
//返回false知道原因吗?两个列表中的数据完全相同,即使顺序相同,仍然返回false。请导游。提前感谢。数据不同
stream=A
vs
bundlestream=A
数据是不同的
stream=A
vs
bundlestream=A
两件事:
bundlestream=…
,而expectedList只表示stream=…
。事情显然不同了。编辑:显示已编辑此更改的OP;所以一定是打字错误,留下了:public static <T,U> void dumpList (List<HashMap<T,U>> list) {
System.out.println("List:");
for (HashMap<T,U> map:list)
for (Map.Entry<T,U> e:map.entrySet())
System.out.println(e.getKey().getClass() + ", " + e.getValue().getClass());
}
并在您的问题中发布它打印的输出?两件事:
bundlestream=…
,而expectedList只表示stream=…
。事情显然不同了。编辑:显示已编辑此更改的OP;所以一定是打字错误,留下了:public static <T,U> void dumpList (List<HashMap<T,U>> list) {
System.out.println("List:");
for (HashMap<T,U> map:list)
for (Map.Entry<T,U> e:map.entrySet())
System.out.println(e.getKey().getClass() + ", " + e.getValue().getClass());
}
并在您的问题中发布它打印的输出?您的表格列表具有bundlestream=A您的表格列表具有bundlestream=A问题在于,最后一个数据对象在它们之间是不同的
stream=A
和bundlestream=A
问题在于最后一个数据对象在它们之间是不同的
stream=A
和bundlestream=A
equals()
的数组列表
继承自抽象列表
:
public boolean equals(Object o)
比较指定对象与此列表是否相等。当且仅当指定的对象也是一个列表时返回true,这两个列表
具有相同的大小,且所有对应的两个元素对
名单是平等的。(如果(e1==null,则两个元素e1和e2相等。)?
e2==null:e1.equals(e2)))换句话说,两个列表被定义为
如果它们包含相同顺序的相同元素,则表示相等
因此,可能您没有为您的列表中的至少一个对象重写.equals()
,equals()
的数组列表
继承自抽象列表
:
public boolean equals(Object o)
比较指定对象与此列表是否相等。当且仅当指定的对象也是一个列表时返回true,这两个列表
具有相同的大小,且所有对应的两个元素对
名单是平等的。(如果(e1==null,则两个元素e1和e2相等。)?
e2==null:e1.equals(e2)))换句话说,两个列表被定义为
如果它们包含相同顺序的相同元素,则表示相等
因此,可能您尚未为列表中的至少一个对象重写.equals()
首先,您必须了解equals在数组列表中的工作方式。
而且您还将HashMap
存储在数组中。
这就是equals方法在ArrayList中的工作方式
public boolean equals(Object paramObject)
{
if (paramObject == this)
return true;
if (!(paramObject instanceof List))
{
return false;
}
ListIterator localListIterator1 = listIterator();
ListIterator localListIterator2 = ((List) paramObject).listIterator();
while ((localListIterator1.hasNext()) && (localListIterator2.hasNext()))
{
Object localObject1 = localListIterator1.next();
Object localObject2 = localListIterator2.next();
if (localObject1 == null)
if (localObject2 != null)
;
else if (!(localObject1.equals(localObject2)))
return false;
}
return ((!(localListIterator1.hasNext())) && (!(localListIterator2.hasNext())));
}
是的,ArrayList内部比较列表中的每个和每个对象,通过再次比较,等于ArrayList中元素的方法。
在您的例子中,元素是HashMap,所以您还需要知道equals
方法在HashMap中是如何工作的。
所以,排序和快速的解决方案是,只需覆盖就等于您自己的方法。不要忘了实现hasCode
方法。
很抱歉回答得太长。首先,您必须了解equals如何在ArrayList
中工作。
而且您还将HashMap
存储在数组中。
这就是equals方法在ArrayList中的工作方式
public boolean equals(Object paramObject)
{
if (paramObject == this)
return true;
if (!(paramObject instanceof List))
{
return false;
}
ListIterator localListIterator1 = listIterator();
ListIterator localListIterator2 = ((List) paramObject).listIterator();
while ((localListIterator1.hasNext()) && (localListIterator2.hasNext()))
{
Object localObject1 = localListIterator1.next();
Object localObject2 = localListIterator2.next();
if (localObject1 == null)
if (localObject2 != null)
;
else if (!(localObject1.equals(localObject2)))
return false;
}
return ((!(localListIterator1.hasNext())) && (!(localListIterator2.hasNext())));
}
是的,ArrayList内部比较列表中的每个和每个对象,通过再次比较,等于ArrayList中元素的方法。
在您的例子中,元素是HashMap,所以您还需要知道equals
方法在HashMap中是如何工作的。
所以,排序和快速的解决方案是,只需覆盖就等于您自己的方法。不要忘了实现hasCode
方法。
很抱歉回答得太长。您能缩进为存储对象定义的“请等于”吗?如果不是的话,那可能是你的问题。很抱歉,所有这些都是打字错误。两个列表都有stream而不是bundlesteam。每个HashMap怎么能包含两个键为“id”的条目?HashMap中的每个键都应该是唯一的,HashMap.put(K,V)
会在使用现有键的情况下替换现有项。它看起来不像Java,更像JSON。是否可以缩进请为存储对象定义等于?如果不是的话,那可能是你的问题。很抱歉,所有这些都是打字错误。两个列表都有stream而不是bundlesteam。每个HashMap怎么能包含两个键为“id”的条目?HashMap中的每个键都应该是唯一的,HashMap.put(K,V)
会在使用现有键时替换现有项。看起来不像Java,更像JSON。您好,感谢您的输入。我很抱歉,所有这些都是打字错误,两个列表都有流,而不是bundlesteam。内部对象是Hashmap,内部Hashmap大多数内容是字符串。HashMaps中的每个键和值都必须正确实现equals()。当你说“大多数”是字符串时,这意味着其中一些不是字符串。是否确定所有键和值类型都正确实现了equals()?请参阅上面的临时编辑。您介意在您的列表上运行该功能并在问题中列出每个列表的结果吗?这将打印出类名