【问题标题】:Java intersection CollectionJava 交集集合
【发布时间】:2016-01-11 22:20:21
【问题描述】:

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

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

谢谢!

【问题讨论】:

  • 这种方法有什么不满意的地方?这似乎是直截了当和明确的。试图变得可爱并尽量减少行数只会让代码更难阅读。
  • 我想了解为什么不能使用 collections.retainAll() ?例如:说 List1.retainAll(list2)

标签: java collections apache-commons-collection


【解决方案1】:

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

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

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

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

return listA.isEmpty() ? listB :
       listB.isEmpty() ? listA :
       new ArrayList(CollectionUtils.intersection(listB, listA));

【讨论】:

    【解决方案2】:

    您对空输入集和非空输入集的每种可能组合都有特定要求。很自然,您有几个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();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-09
      • 1970-01-01
      • 2017-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多