我有两个ListOne和ListTwo列表。 我必须找出ListOne中ListFwo中不存在的所有元素。 同样 我必须找出ListOne中不存在的所有ListTwo元素。
我的下面的代码正在运行,但我想可能有更好的方法
List<Long> listOne=...Some valid values;
List<Long> listTwo=...Some valid values;
List<Long> listThree=new ArrayList<Long>();
List<Long> listFour=new ArrayList<Long>();
for (Long id: ListOne) {
if(!listTwo.contains(id)){
listThree.add(id);
}
}
for (Long id: ListTwo) {
if(!listOne.contains(id)){
listFour.add(id);
}
}
答案 0 :(得分:3)
下面应该适合你
List<Long> listOne =...Some valid values;
List<Long> listTwo =...Some valid values;
List<Long> listThree = new ArrayList<>(listOne);
List<Long> listFour = new ArrayList<>(listTwo);
listThree.removeAll(listTwo);
listFour.removeAll(listOne);
来自java doc:
RemoveAll:从此列表中删除指定集合中包含的所有元素(可选操作)。
答案 1 :(得分:3)
作为Lino答案的替代方案,您还可以以功能方式重写代码:
List<Long> listOneButListTwoElements = listOne.stream()
.filter(l-> !listTwo.contains(l))
.collect(Collectors.toList());
List<Long> listTwoButListOneElements = listTwo.stream()
.filter(l-> !listOne.contains(l))
.collect(Collectors.toList());
答案 2 :(得分:3)
要真正有效率,你可以这样做:
Set<Long> setOne = new HashSet<>(listOne);
Set<Long> setTwo = new HashSet<>(listTwo);
List<Long> listThree = listOne.stream()
.filter(e -> !setTwo.contains(e))
.collect(Collectors.toList());
List<Long> listFour = listTwo.stream()
.filter(e -> !setOne.contains(e))
.collect(Collectors.toList());
这样可以避免列表长度为m*n
和m
的{{1}}复杂性问题。
编辑:如果您不想使用中间变量(如提及@davidxxx),您可以这样做:
n
有多种方法可以否定谓词。不需要在这里覆盖它,它已经answered。