• 技术文章 >Java >Java入门

    java怎么判断两个集合之间是否有交集

    王林王林2020-11-20 15:13:58转载14463

    背景:

    前端传了list集合,后端字段里存的也是(1,2,3,4)这种形式。不借助sql,怎么看前端传的集合是否在后端字段的集合中?

    (学习视频分享:java教学视频

    代码:

    public static boolean judgeIntersection(List<String> list1,List<String> list2){
        boolean flag = false;
        // 使用retainAll会改变list1的值,所以写一个替代
        List<String> origin = new ArrayList<>();
        origin.addAll(list1);
        origin.retainAll(list2);
        // 有交集
        if(origin.size()>0){
            flag = true;
        }
        return flag;
    }

    boolean flag = origin.retainAll(Collection<?> c)

    若origin中有集合C中没有的数据,返回false。没有返回true

    同时,origin集合会改变,只保留两个集合相同的数据,换句话说,origin集合有被删除的数据,返回false

    那如何判断是否有交集?

    1、两个集合,一个一样的都没有,origin为空,返回值是false

    2、两个集合,碰巧,origin中的数据都在c中,origin不变,返回值是true

    这两种特殊情况都是导致单纯靠返回值true or false,是不能判断有交集的。所以根据要origin集合中的个数,>0,就是有交集

    retainAll(Collection<?> c)源码

    public boolean retainAll(Collection<?> c) {
            // 判断c集合是否为空
            Objects.requireNonNull(c);
            return batchRemove(c, true);
        }
     
        private boolean batchRemove(Collection<?> c, boolean complement) {
            // 得到调用该函数的集合。因为是引用类型,所以修改了都会有变化
            final Object[] elementData = this.elementData;
            // w:记录交集的数据都放到elementData前面,w是其位置分界线
            int r = 0, w = 0;
            // 返回值 用于判断elementData有没有被修改
            boolean modified = false;
            try {
                // 循环elementData集合,判断其中元素是否在c集合中
                for (; r < size; r++)
                    // 若在集合中,则w自增,并将该值放到elementData[w]中,即是交集的数据都放到集合的前面
                    if (c.contains(elementData[r]) == complement)
                        elementData[w++] = elementData[r];
            } finally {
                // Preserve behavioral compatibility with AbstractCollection,
                // even if c.contains() throws.
                // 正常情况下,经过上面的循环,r==size。为防止出现循环异常,将由于异常导致的r到size是交集的数据但并没有放到对应w的位置的数据,都放到对应w之后的位置上
                if (r != size) {
                    System.arraycopy(elementData, r,
                                     elementData, w,
                                     size - r);
                    w += size - r;
                }
                // 若elementData中有数据不在c集合中,就清理掉w位置之后的数据,便于垃圾回收
                if (w != size) {
                    // clear to let GC do its work
                    for (int i = w; i < size; i++)
                        elementData[i] = null;
                    // 记录elementData集合被增删的次数,这里是删除
                    modCount += size - w;
                    // 赋值最新的size
                    size = w;
                    // elementData集合被清理,modified为true
                    modified = true;
                }
            }
            return modified;
        }

    相关推荐:java入门教程

    以上就是java怎么判断两个集合之间是否有交集的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:csdn,如有侵犯,请联系admin@php.cn删除
    专题推荐:java 集合 交集
    上一篇:map遍历的几种方式分别是什么 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • php获得数组交集与差集的方法是什么• php求两数组交集的三种方法详解• PHP如何计算两个时间段交集的天数?• mysql如何求两个查询的交集
    1/1

    PHP中文网