Java 比较两个列表的对象值?

2022-08-31 20:33:30

我有两个列表***和ListB<MyData> listB = new ArrayList<MyData>()都包含MyData类型的对象,MyData包含这些变量。*ListA<MyData> listA = new ArrayList<MyData>()

MyData {
    String name;
    boolean check;
} 

ListA和ListB都包含MyData对象,现在我必须比较列表的对象值,这里的名字以及检查变量,就像ListA包含这些对象值一样

ListA = ["Ram",true],["Hariom",true],["Shiv",true];

和 ListB 还包含

ListB = ["Ram",true],["Hariom",true],["Shiv",true];

那么我必须比较列表并返回 false,因为两个列表是相同的,但是如果 ListA 包含

ListA = ["Ram",true],["Hariom",true],["Shiv",false];

列表 B 包含

 ListB = ["Ram",true],["Hariom",true],["Shiv",true];

然后我必须比较列表并返回true,因为两个列表不一样

反之亦然,因此任何列表值的任何细微变化都必须返回 true。我必须在这里提到的一件事对象可以按任何顺序排列。


答案 1

这不是最有效的解决方案,但最简洁的代码是:

boolean equalLists = listA.size() == listB.size() && listA.containsAll(listB);

更新:

@WesleyPorter是对的。如果集合中存在重复对象,则上述解决方案将不起作用。
对于完整的解决方案,您需要循环访问集合,以便正确处理重复的对象。

private static boolean cmp( List<?> l1, List<?> l2 ) {
    // make a copy of the list so the original list is not changed, and remove() is supported
    ArrayList<?> cp = new ArrayList<>( l1 );
    for ( Object o : l2 ) {
        if ( !cp.remove( o ) ) {
            return false;
        }
    }
    return cp.isEmpty();
}

2014 年 10 月 28 日更新:

@RoeeGavriel是对的。返回语句必须是有条件的。上面的代码已更新。


答案 2

ArrayList已经有了对此方法的支持。引用文档equals

...换言之,如果两个列表以相同的顺序包含相同的元素,则将其定义为相等。

它确实要求您在类中正确实现。equalsMyData

编辑

您已经更新了问题,指出列表可能具有不同的顺序。在这种情况下,请先对列表进行排序,然后应用相等。