0

こんにちは、私はそれに保存されている2つ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

2つのこと:

  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

まず、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 内の each と evertObject を比較し、再度equalsArrayList 内の要素のメソッドを使用して比較します。あなたの場合、要素は HashMap であるため、equalsHashMap でメソッドがどのように機能するかを知る必要もあります。http://javarevisited.blogspot.in/2011/02/how-hashmap-works-in-java.html したがって、ソートと迅速な解決策はequals、独自のメソッドをオーバーライドすることです。hasCodeまた、メソッドも 実装することを忘れないでください。ArrayList<Field> のインデックスを返す方法 長い回答で申し訳ありません。

于 2013-08-08T05:06:00.080 に答える