0

嗨,我有两个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。请指导。提前致谢。

4

6 回答 6

4

两件事情:

  1. tableList 中的最后一个元素表示bundlestream=...,而 expectedList 只是表示stream=...。显然有些不同。编辑:看来 OP 已删除此更改;所以它一定是一个错字,留下:

  2. 您确定存储在列表中的对象正确地实现了 equals()(或者,在这种情况下,是列表中 HashMap 中的键和值)吗?如果这些对象的 equals() 没有返回预期结果,那么 ArrayList 的 equals() 也不会。

临时编辑:

@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);

并发布它在您的问题中打印的输出?

于 2013-08-08T04:26:42.400 回答
1

数据不一样

stream=A
vs
bundlestream=A
于 2013-08-08T04:26:14.693 回答
0

你的 tableList 有 bundlestream=A

于 2013-08-08T04:27:39.627 回答
0

问题是数据的最后一个对象在它们中是不同的。

stream=Abundlestream=A

于 2013-08-08T04:27:47.237 回答
0

equals()forArrayList继承自AbstractList

public boolean equals(Object o)

比较指定对象与此列表是否相等。当且仅当指定对象也是一个列表时返回 true,两个列表具有相同的大小,并且两个列表中所有对应的元素对都相等。(如果 (e1==null ? e2==null : e1.equals(e2)) 两个元素 e1 和 e2 相等。)换句话说,如果两个列表以相同的顺序包含相同的元素,则它们被定义为相等.

因此,.equals()您的List.

于 2013-08-08T04:27:47.610 回答
0

首先,您必须了解 equals 在ArrayList. 而且您还存储HashMap在数组中。这就是 ArrayList 中 equals 方法的工作原理

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,再通过equalsArrayList中元素的方法进行比较。在你的情况下,元素是 HashMap,所以你还需要知道equals方法在 HashMap 中是如何工作的。http://javarevisited.blogspot.in/2011/02/how-hashmap-works-in-java.html 所以,排序和快速的解决方案就是equals你自己的覆盖方法。并且不要忘记实现hasCode方法。 如何返回 ArrayList<Field> 的索引 很抱歉,答案很长。

于 2013-08-08T05:06:00.080 回答