#1 Java进阶系列--交集、并集、差集

一、交集、并集、差集和补集的概念
这里写图片描述
注意:在集合论和数学的其他分支中,存在补集的两种定义:相对补集和绝对补集。
1、相对补集
若A 和B 是集合,则A 在B 中的相对补集是这样一个集合:其元素属于B但不属于A,B - A = { x| x∈B且x∉A}。
2、绝对补集
若给定全集U,有A⊆U,则A在U中的相对补集称为A的绝对补集(或简称补集),写作∁UA。

二、代码实现

package com.yzh.maven.test;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class CollectionTest {
    /**
        @functionname:unique
        @description:为List元素去重
        @author:yzh
        @param:list
        @date:2018-09-02
    */
    public <T> List<T> unique(List<T> list){
        List<T> newList = new ArrayList<T>();
        Set<T> set = new HashSet<T>();
        //元素去重
        for(T t:list){
            if(!set.contains(t)){
                set.add(t);
            }
        }
        //将set转化为list
        for(T t:set){
            //set元素是无序的
            if(!newList.contains(t)){
                newList.add(t);
            }
        }
        return newList;
    }

    /**
        @functionname:intersect
        @description:两个list的交集
        @author:yzh
        @param:list1
        @param:list2
        @date:2018-09-02
    */
    public <T> List<T> intersect(List<T> list1,List<T> list2){
        //为list1元素去重
        List<T> fromList1 =  unique(list1);
        //为list2元素去重
        List<T> fromList2 =  unique(list2);
        List<T> toList =  new ArrayList<T>();
        for(T t:fromList1){
            if(fromList2.contains(t)){
                toList.add(t);
            }
        }
        return toList;
    }

    /**
        @functionname:union
        @description:两个list的并集
        @author:yzh
        @param:list1
        @param:list2
        @date:2018-09-02
    */
    public <T> List<T> union(List<T> list1,List<T> list2){
        //为list1元素去重
        List<T> fromList1 =  unique(list1);
        //为list2元素去重
        List<T> fromList2 =  unique(list2);
        Set<T> set = new HashSet<T>();
        List<T> toList =  new ArrayList<T>();
        //将fromList1的元素加入set
        for(T t:fromList1){
            if(!set.contains(t)){
                set.add(t);
            }
        }
        //将fromList2的元素加入set
        for(T t:fromList2){
            if(!set.contains(t)){
                set.add(t);
            }
        }
        //将set转化为list
        for(T t:set){
            //set元素是无序的
            if(!toList.contains(t)){
                toList.add(t);
            }
        }
        return toList;
    }

    /**
        @functionname:minus
        @description:获取list2相对list1的差集
        @author:yzh
        @param:list1
        @param:list2
        @date:2018-09-02
    */
    public <T> List<T> minus(List<T> list1,List<T> list2){
        //为list1元素去重
        List<T> fromList1 = unique(list1);
        //为list2元素去重
        List<T> fromList2 = unique(list2);
        List<T> toList =  new ArrayList<T>();
        for(T t:fromList1){
            if(!toList.contains(t)){
                toList.add(t);
            }
        }
        for(T t:fromList2){
            if(toList.contains(t)){
                toList.remove(t);
            }
        }
        return toList;
    }

    public static void main(String[] args) {
        CollectionTest c = new CollectionTest();
        List<Integer> list = new ArrayList<Integer>();
        for(int i = 0;i<5;i++){
            list.add(i);
        }
        list.add(2);
        list.add(3);
        System.out.println("list: ");
        for(int i:list){
            System.out.print(i+" ");
        }
        System.out.println("\n去除重复元素的list2: ");
        List<Integer>list2 = c.unique(list);
        for(int i:list2){
            System.out.print(i+" ");
        }
        List<Integer> list3 = new ArrayList<Integer>();
        for(int i = 3;i<5;i++){
            list3.add(i);
        }
        list3.add(20);
        list3.add(30);
        System.out.println("\nlist1和list2的交集list3: ");
        for(int i:list3){
            System.out.print(i+" ");
        }
        System.out.println("\nlist4: ");
        List<Integer> list4 = c.intersect(list,list3);
        for(int i:list4){
            System.out.print(i+" ");
        }

        System.out.println("\nlist1和list2的并集list5: ");
        List<Integer> list5 = c.union(list,list3);
        for(int i:list5){
            System.out.print(i+" ");
        }

        System.out.println("\nlist2相对于list1的差集list6: ");
        List<Integer> list6 = c.minus(list,list3);
        for(int i:list6){
            System.out.print(i+" ");
        }

        System.out.println("\nlist1相对于list2的差集list7: ");
        List<Integer> list7 = c.minus(list3,list);
        for(int i:list7){
            System.out.print(i+" ");
        }

    }
}
/**output:
list: 
0 1 2 3 4 2 3 
去除重复元素的list2: 
0 1 2 3 4 
list1和list2的交集list3: 
3 4 20 30 
list4: 
3 4 
list1和list2的并集list5: 
0 1 2 3 4 20 30 
list2相对于list1的差集list6: 
0 1 2 
list1相对于list2的差集list7: 
20 30 
**/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值