1

我想找到一种优雅的方法:

我有两个集合 A 和 B,如果它们都不为空,那么我需要做交集(将公共元素存储在另一个列表中)。

如果其中一个是空的,我将不得不采用另一个的所有元素。

如果两者都为空,则生成的集合将为空。

有没有办法在不使用许多 if 条件且性能良好的情况下解决这个问题?

这是有效的,但它不是很好:

import org.apache.commons.collections4.CollectionUtils;
...
...
    List<Long> listA = new ArrayList<Long>();
    List<Long> listB = new ArrayList<Long>();
    //initialisation list A & listB

    List<Long> outputList = null;
    if(listA.size()>0 && listB.size() >0) {
        outputList = new ArrayList(CollectionUtils.intersection(listB, listA));
    }
    else if(listA.size()==0){
        outputList = listB;
    }
    else if(listB.size()==0){
        outputList = listA;
    }

谢谢!

4

2 回答 2

2

我不会这么想,仅仅因为你的情况:

如果一个列表为空,则返回另一个列表。

这不是交集的典型定义,我不确定它是否是标准库中涵盖的常见操作。因此,您必须自己处理该逻辑。

如果您真的想摆脱 if 语句,那么您可以使用三元运算符:

return listA.isEmpty() ? listB :
       listB.isEmpty() ? listA :
       new ArrayList(CollectionUtils.intersection(listB, listA));
于 2016-01-11T22:28:40.540 回答
1

您对空输入集和非空输入集的每种可能组合都有特定要求。你有几个if陈述来区分情况并根据你的要求做出回应是很自然的。没有办法解决这个问题。

但是您的解决方案可以改进一点:

  • .isEmpty()使用它而不是将大小与 0 进行比较更惯用
  • 你忘记了一个else声明,这就是空壳的处理

修复这些问题,代码变为:

final List<Long> outputList;
if (!listA.isEmpty() && !listB.isEmpty()) {
    outputList = new ArrayList(CollectionUtils.intersection(listB, listA));
}
else if (listA.isEmpty()) {
    outputList = listB;
}
else if (listB.isEmpty()) {
    outputList = listA;
} else {
    outputList = Collections.emptyList();
}
于 2016-01-11T23:00:58.700 回答