侧边栏壁纸
  • 累计撰写 48 篇文章
  • 累计创建 33 个标签
  • 累计收到 2 条评论

目 录CONTENT

文章目录

java求两个List集合的差集,并集和交集

Angus
2023-09-08 / 0 评论 / 0 点赞 / 32 阅读 / 5718 字

以下使用List作为例子实现,一共有三种实现方式

Java 集合框架实现

示例代码:

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class SetOperations {
    public static void main(String[] args) {
        List<String> list1 = new ArrayList<>();
        list1.add("A");
        list1.add("B");
        list1.add("C");

        List<String> list2 = new ArrayList<>();
        list2.add("B");
        list2.add("C");
        list2.add("D");

        // 求差集
        List<String> difference = new ArrayList<>(list1);
        difference.removeAll(list2);
        System.out.println("差集:");
        for (String item : difference) {
            System.out.println(item);
        }

        // 求并集
        Set<String> union = new HashSet<>(list1);
        union.addAll(list2);
        System.out.println("\n并集:");
        for (String item : union) {
            System.out.println(item);
        }

        // 求交集
        List<String> intersection = new ArrayList<>(list1);
        intersection.retainAll(list2);
        System.out.println("\n交集:");
        for (String item : intersection) {
            System.out.println(item);
        }
    }
}

输出结果为:

差集:
A

并集:
A
B
C
D

交集:
B
C

在这个示例代码中,使用了 removeAll() 方法来求两个集合的差集,使用了 addAll() 方法来求两个集合的并集,使用了 retainAll() 方法来求两个集合的交集。注意,差集和交集的结果会保留在原始的 List 中,而并集的结果存储在一个新的 Set 中。

Stream API实现

可以使用Java 8的Stream API来实现。以下是示例代码:

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

public class SetOperations {
    public static void main(String[] args) {
        List<String> list1 = new ArrayList<>();
        list1.add("A");
        list1.add("B");
        list1.add("C");

        List<String> list2 = new ArrayList<>();
        list2.add("B");
        list2.add("C");
        list2.add("D");

        // 求差集
        List<String> difference = list1.stream()
                .filter(item -> !list2.contains(item))
                .collect(Collectors.toList());
        System.out.println("差集:");
        difference.forEach(System.out::println);

        // 求并集
        Set<String> union = Stream.concat(list1.stream(), list2.stream())
                .collect(Collectors.toSet());
        System.out.println("\n并集:");
        union.forEach(System.out::println);

        // 求交集
        List<String> intersection = list1.stream()
                .filter(list2::contains)
                .collect(Collectors.toList());
        System.out.println("\n交集:");
        intersection.forEach(System.out::println);
    }
}

这个示例中使用了Stream API的一些常用操作,如filter()collect()concat()等来实现求差集、并集和交集。通过filter()筛选出符合条件的元素,collect()将结果收集到一个新的集合中,concat()合并两个流,最后通过forEach()遍历打印结果。

输出结果与之前的示例代码相同:

差集:
A

并集:
A
B
C
D

交集:
B
C

使用Java的Stream API可以更加简洁地实现集合操作,并且具有函数式编程的特性。

第三方库工具

常用的几个第三方库:

  1. Apache Commons Collections: Apache Commons Collections 是一个常用的 Java 工具类库,提供了很多集合操作的工具类。可以使用 CollectionUtils 类中的 subtract() 方法求取两个集合的差集,union() 方法求取两个集合的并集,intersection() 方法求取两个集合的交集。 示例代码:
   import org.apache.commons.collections4.CollectionUtils;

   List<String> list1 = Arrays.asList("A", "B", "C");
   List<String> list2 = Arrays.asList("B", "C", "D");

   // 求差集
   Collection<String> difference = CollectionUtils.subtract(list1, list2);
   System.out.println("差集:");
   difference.forEach(System.out::println);

   // 求并集
   Collection<String> union = CollectionUtils.union(list1, list2);
   System.out.println("\n并集:");
   union.forEach(System.out::println);

   // 求交集
   Collection<String> intersection = CollectionUtils.intersection(list1, list2);
   System.out.println("\n交集:");
   intersection.forEach(System.out::println);

输出结果与之前的示例代码相同。

  1. Google Guava: Google Guava 是 Google 提供的一个功能丰富的 Java 工具包,其中的 Sets 类提供了各种集合操作的方法。可以使用 Sets.difference() 方法求取两个集合的差集,Sets.union() 方法求取两个集合的并集,Sets.intersection() 方法求取两个集合的交集。 示例代码:
   import com.google.common.collect.Sets;

   Set<String> set1 = Sets.newHashSet("A", "B", "C");
   Set<String> set2 = Sets.newHashSet("B", "C", "D");

   // 求差集
   Set<String> difference = Sets.difference(set1, set2);
   System.out.println("差集:");
   difference.forEach(System.out::println);

   // 求并集
   Set<String> union = Sets.union(set1, set2);
   System.out.println("\n并集:");
   union.forEach(System.out::println);

   // 求交集
   Set<String> intersection = Sets.intersection(set1, set2);
   System.out.println("\n交集:");
   intersection.forEach(System.out::println);

输出结果与之前的示例代码相同。 这些第三方库提供了更便捷的方式来实现集合操作,可以根据自己的需求选择适合的工具类。 确保在使用第三方库之前,先添加相应的依赖到项目中。

0

评论区