无论顺序如何,比较两个List <E>

aha*_*cse 1 java list

我有两个E类型列表List list1,List list2.E对象是一个POJO类,包含一行以下数据.两个列表都包含相同的数据.例如,在最后一列,如果我将false更改为true,则无法检测到.

| statusId  | statusName                                | statusState | isRequire            |
| 3         | Approved                                  | APPROVED    | false                |
| 201       | Attributed                                | REJECTED    | true                 |
| 202       | Denied                                    | REJECTED    | false                |
| 204       | Fraud                                     | REJECTED    | false                |
| 205       | Insufficient                              | REJECTED    | false                |
| 206       | Invalid                                   | REJECTED    | false                |
| 207       | Cancelled                                 | REJECTED    | false                |
| 208       | Cannot traced                             | REJECTED    | false                |
| 209       | Transaction online                        | REJECTED    | false                |
| 210       | Voucher                                   | REJECTED    | false                |
| 211       | does not meet req                         | REJECTED    | false                |
Run Code Online (Sandbox Code Playgroud)

我想写一个函数,这样如果数据是那两个列表不同,那么就可以检测到它.以下是我的代码,但似乎总是给出"假",两个列表中的数据是相同还是不同.

   private boolean compareLists(List<Status> actualStatuses, List<Status> expectedStatuses) {
    boolean indicator = false;
    if (actualStatuses!= null && expectedStatuses!=null && actualStatuses.size() == expectedStatuses.size()){
        for (Status expectedStatusData : expectedStatuses){
            for(Status actualStatusData : actualStatuses){
                if(actualStatusData.getStatusId() == expectedStatusData.getStatusId()
                        && actualStatusData.getStatusName().equals(expectedStatusData.getStatusName())
                        && actualStatusData.getStatusState().equals(expectedStatusData.getStatusState())
                        && actualStatusData.isEnable() == expectedStatusData.isEnable()
                        && actualClaimStatusData.isRequire() == expectedStatusData.isRequire()){
                    indicator = true;
                    break;
                }
                else indicator = false;
            }
        }
        if (indicator)
            return true;
    }
    else
        return false;

    return indicator;
}
Run Code Online (Sandbox Code Playgroud)

xp5*_*500 5

执行此操作的更好方法(假设列表不包含重复值)是将一个列表的所有元素存储在a中HashSet,然后检查是否HashSet包含另一个列表的所有元素以及它们的大小是否相同.

private <E> boolean listsHaveSameElements(final List<E> l1, final List<E> l2) {
    final Set<E> set = new HashSet<>(l1);
    return l1.size() == l2.size() && set.containsAll(l2);
}
Run Code Online (Sandbox Code Playgroud)

这是一个O(n+m)解决方案,而使用时List.containsAll()需要迭代另一个列表的所有元素以检查是否存在O(n*m)