java - 不考虑顺序比较两个 List<E>

标签 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                |

我想编写一个函数,以便如果数据是这两个列表不同则可以检测到。以下是我的代码,但无论两个列表中的数据相同还是不同,它似乎总是给出“假”。

   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;
}

最佳答案

一个更好的方法(假设列表不包含重复值)是将一个列表的所有元素存储在 HashSet 中,然后检查 HashSet code> 包含另一个列表的所有元素,并且它们的大小相同。

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

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

关于java - 不考虑顺序比较两个 List<E>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31407783/

相关文章:

Python - 使用 BeautifulSoup 创建 URL 列表时出现问题

r - 在 R 中查找列表中的子列表

java - 从 Java 查询 Mac OS X Spotlight

java - 设置 Maven 环境变量

java - 当可以导入 java 类时为什么要使用依赖注入(inject)?

java - Android 项目中图像的最大宽度是多少? ( Sprite 相关问题)

python - 删除列表最后一个元素的最有效方法?

java - 动态迭代内部包含两个索引的数组列表

java - java中的url编码?

c# - 在 C# 列表容器中查找和/或访问值