【问题标题】:Is there any method in the standard API to inverse retainAll()?标准API中是否有任何方法可以反转retainAll()?
【发布时间】:2011-08-13 14:58:49
【问题描述】:

是否有任何方法可以一次性为我完成以下操作:

List<String> list1 = new ArrayList<String>(Arrays.asList("A","B","C","D"));
List<String> list2 = new ArrayList<String>(Arrays.asList("B","C","E","F"));
List<String> list3 = new ArrayList<String>();
for(String element : list2){
   if(!list1.contains(element))
   list3.add(element);
}

因此 list3 应该包含元素“E”和“F”。

【问题讨论】:

    标签: java api list collections arraylist


    【解决方案1】:

    你的意思是?

    List<String> list3 = new ArrayList<String>(list2);
    list3.removeAll(list1);
    

    但是,进行联合和交集通常最好使用集合而不是列表。 (而且更高效)

    Set<String> set3 = new LinkedHashSet<String>(set2);
    set3.removeAll(set1);
    

    【讨论】:

    • 是的,这就行了!谢谢。如果我使用 Lists 而不是 Sets,会不会有任何不利影响?
    • 集合假定条目的唯一性并忽略重复项。列表是有序的并且允许重复。我怀疑你想要前者而不是后者。
    【解决方案2】:

    或者用 Guava 的Sets.intersection():

    Lists.newArrayList(Sets.intersection(ImmutableSet.of(list1), ImmutableList.of(list2)));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-26
      • 2020-08-03
      • 2015-09-12
      • 2021-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多