您好我有两个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。请指导。提前谢谢。
答案 0 :(得分:4)
两件事:
tableList中的最后一个元素表示bundlestream=...
,而expectedList只表示stream=...
。有些东西显然不同。 编辑:OP似乎编辑了这个变化;所以它一定是一个错字,离开:
您确定列表中存储的对象是否正确实现了equals()(或者,在这种情况下,列表中的HashMaps中的键和值)?如果这些对象的equals()没有返回预期的结果,那么ArrayList的equals()也不会。(/ p>
临时编辑:
@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());
}
在两个列表中,例如:
dumpList(tableList);
dumpList(expectedList);
并在你的问题中发布它打印的输出?
答案 1 :(得分:1)
数据不同
stream=A
vs
bundlestream=A
答案 2 :(得分:0)
你的tableList有bundlestream = A
答案 3 :(得分:0)
问题是数据的最后一个对象是不同的。
stream=A
和bundlestream=A
答案 4 :(得分:0)
equals()
的{{1}}继承自ArrayList
:
AbstractList
将指定对象与此列表进行比较以获得相等性。当且仅当指定的对象也是列表时,返回true,两个列表 具有相同的大小,以及两者中所有相应的元素对 清单是平等的。 (如果(e1 == null,两个元素e1和e2相等)? e2 == null:e1.equals(e2))。)换句话说,定义了两个列表 如果它们包含相同顺序的相同元素,则相等。
所以,也许你还没有覆盖public boolean equals(Object o)
中至少一个对象的.equals()
。
答案 5 :(得分:0)
首先,您必须了解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在内部比较List中的每个和evertObject,再次通过ArrayList中的元素equals
方法进行比较。
在您的情况下,元素是HashMap,因此U还需要知道equals
方法在HashMap中的工作原理。 http://javarevisited.blogspot.in/2011/02/how-hashmap-works-in-java.html
因此,排序和快速解决方案就是您自己的equals
方法。并且不要忘记也实现hasCode
方法。
How to return index of ArrayList<Field>
对不起,答案很长。