java数组的交集和并集

数组的并集

求数组的并集时,我们可以通过Set集合的去重机制(Set集合特性无序,不可重复,例如:当已经添加进集合一个数6,再次添加一个数字6,集合是不会成功添加进去的)

思路:我们仅需要定义一个set集合,然后遍历两个数组,同时添加进集合中,再返回集合就获得了两个数组的交集。
如下所示

		Set<Integer> set = new HashSet<>();
        public int[] sum(int a[], int b[]) {
            for (int i = 0; i < a.length; i++) {
                set.add(a[i]);
            }
            for (int j = 0; j < b.length; j++) {
                set.add(b[j]);
            }
            return set.stream().mapToInt(i -> i).toArray();//Set集合转为int数组
        }

数组的交集

第一种方式:

可以利用java的api方法retainAll()
retainAll方法的解释是:retainAll()方法用于保留 arraylist 中在指定集合中也存在的那些元素,也就是删除指定集合中不存在的那些元素。就是求交集的意思
详情见:https://www.runoob.com/java/java-arraylist-retainall.html
有人说,写算法时不让直接用api方法,这样的话可以用Set的去重机制去解决,在上面我们利用Set去重求了数组的并集,同样我们可以利用这个特性求交集。
如下所示

		List<Integer> a1 = new ArrayList<>();
        ArrayList<Integer> b1 = new ArrayList<>();
        int a[] = {1, 3, 5, 7};
        int b[] = {2, 3, 4, 9};
        //求两个数组的交集(第一种方式:利用集合类的retainAll()方法)	
        public int[] retain(int a[], int b[]) {
            for (int i = 0; i < a.length; i++) {
                a1.add(a[i]);
            }
            for (int j = 0; j < b.length; j++) {
                b1.add(b[j]);
            }
            b1.retainAll(a1);
            return b1.stream().mapToInt(i -> i).toArray();//List集合转为int数组
        }

第二种方式

①遍历其中一个数组,然后添加到Set集合中;
②遍历另外一个数组,判断每个数是否已存在于Set集合;若已存在,把当前数保存起来,最后把保存起来的数返回即可。
如下所示

        Set<Integer> set = new HashSet<>();
        Set<Integer> result = new HashSet<>();
		int a[] = {1, 3, 5, 7};
        int b[] = {2, 3, 4, 9};
        //求两个数组的交集(第二种方式:利用set去重)	
        public int[] retain2(int a[], int b[]) {
            for (int i : a) {
                set.add(i);
            }
            for (int i : b) {
                if (set.contains(i)) {
                    result.add(i);
                }
            }
            return result.stream().mapToInt(i -> i).toArray();//Set集合转为int数组
        }

总结

求数组并集和交集完整代码如下:

    public class SumandRetain {
        Set<Integer> set = new HashSet<>();
        List<Integer> a1 = new ArrayList<>();
        List<Integer> b1 = new ArrayList<>();
        int a[] = {1, 3, 5, 7};
        int b[] = {2, 3, 4, 9};
		
        //求两个数组的并集(利用Set的去重机制)
        public int[] sum(int a[], int b[]) {
            for (int i = 0; i < a.length; i++) {
                set.add(a[i]);
            }
            for (int j = 0; j < b.length; j++) {
                set.add(b[j]);
            }
            return set.stream().mapToInt(i -> i).toArray();//Set集合转为int数组
        }

        //求两个数组的交集(第一种方式:利用集合类的retainAll()方法)	
        public int[] retain(int a[], int b[]) {
            for (int i = 0; i < a.length; i++) {
                a1.add(a[i]);
            }
            for (int j = 0; j < b.length; j++) {
                b1.add(b[j]);
            }
            b1.retainAll(a1);
            return b1.stream().mapToInt(i -> i).toArray();//List集合转为int数组
        }

        //求两个数组的交集(第二种方式:利用set去重)	
        public int[] retain2(int a[], int b[]) {
            Set<Integer> result = new HashSet<>();

            for (int i : a) {
                set.add(i);
            }
            for (int i : b) {
                if (set.contains(i)) {
                    result.add(i);
                }
            }
            return result.stream().mapToInt(i -> i).toArray();//Set集合转为int数组
        }
        
    }
posted @   我的小鱼干嘞  阅读(1528)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示