我有两个 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/