我有两个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)
执行此操作的更好方法(假设列表不包含重复值)是将一个列表的所有元素存储在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)