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
两件事:

  • tableList中的最后一个元素表示
    bundlestream=…
    ,而expectedList只表示
    stream=…
    。事情显然不同了。编辑:显示已编辑此更改的OP;所以一定是打字错误,留下了:

  • 您确定列表中存储的对象正确地实现了equals()(或者,在本例中,是列表中哈希映射中的键和值)?如果这些对象的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());
    }
    
    并在您的问题中发布它打印的输出?

    两件事:

  • tableList中的最后一个元素表示
    bundlestream=…
    ,而expectedList只表示
    stream=…
    。事情显然不同了。编辑:显示已编辑此更改的OP;所以一定是打字错误,留下了:

  • 您确定列表中存储的对象正确地实现了equals()(或者,在本例中,是列表中哈希映射中的键和值)?如果这些对象的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());
    }
    

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

    您的表格列表具有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()?请参阅上面的临时编辑。您介意在您的列表上运行该功能并在问题中列出每个列表的结果吗?这将打印出类名