列表项之间的差异

时间:2017-11-06 12:17:37

标签: java arraylist

我有两个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);
        }
    }

3 个答案:

答案 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*nm的{​​{1}}复杂性问题。

编辑:如果您不想使用中间变量(如提及@davidxxx),您可以这样做:

n

有多种方法可以否定谓词。不需要在这里覆盖它,它已经answered