java 实现数组取差集 高效方法

已知 数组

String y = "a,b,c,d,e,f,g";

String x = "c,d,e,f";

 

求:取y与x的差集。。即确定x在y中肯定存在

使用工具类

    /**
     * @描述 两个数组取差集, 从多的里面取。。。
     * @参数 [fids, pids] fids是多的数组;pids是少的数组
     * @返回值 java.lang.String
     * @创建人 Young
     * @创建时间 2019/4/12 20:46
     **/
    private String getDifSet(String mores, String lesss) {
        String[] more = mores.split(",");
        String[] less = lesss.split(",");
        //将多转换为set fid 肯定不是小的
        Set<String> set = new HashSet<String>(Arrays.asList(more));
        for (String p : less) {
            // 如果集合里有相同的就删掉,如果没有就将值添加到集合
            if (set.contains(p)) {
                set.remove(p);
            } else {
                set.add(p);
            }
        }
        return StringUtils.join(set.toArray(), ",");
    }

 

此时只是确定是大小包含的关系。。。

 

2,如果y中含有x中不存在的元素,那么执行出来的就是不一样了。。

        String x = "a,b,c,d,e,f,g";
        String y = "c,d,e,f,x,y";

两个合集 减掉 两个并集。

 

3,如果两个元素不确定是否包含的关系,只想取只在x中存在(即去掉y和x共有 的值 且在x中存在的值)

    private static  String getDifSet(String mores, String lesss) {
        String[] more = mores.split(",");
        String[] less = lesss.split(",");
        //将多转换为set fid 肯定不是小的
        Set<String> set = new HashSet<String>(Arrays.asList(more));
        for (String p : less) {
            // 如果集合里有相同的就删掉,如果没有就将值添加到集合
            if (set.contains(p)) {
                set.remove(p);
            }
        }
        return StringUtils.join(set.toArray(), ",");
    }

去除添加的else结构。

如果不确定大小的时候。。。

需要先判断哪个是大的集合

 

1,如果是取两个集合的并集 去除 两个集合的合集,且不确定哪个是大的集合

    public static void main(String[] args) {
        String x = "a,b,c,m,n";
        String y = "a,b,c,d,e,f";
        String difSet = getDifSet(x, y);
        System.out.println(difSet);
    }

    /**
     * @描述 两个数组取差集, 从多的里面取。。。
     * @参数 [fids, pids] fids是多的数组;pids是少的数组
     * @返回值 java.lang.String
     * @创建人 Young
     * @创建时间 2019/4/12 20:46
     **/
    private static String getDifSet(String mores, String lesss) {
        String[] more = mores.split(",");
        String[] less = lesss.split(",");
        //将多转换为set fid 肯定不是小的
        Set<String> set = new HashSet<String>(Arrays.asList(more.length > less.length ? more : less));
        for (String p : less.length > more.length ? more:less) {
            // 如果集合里有相同的就删掉,如果没有就将值添加到集合
            if (set.contains(p)) {
                set.remove(p);
            }else {
                set.add(p);
            }
        }
        return StringUtils.join(set.toArray(), ",");
    }

 

2,如果是取大集合中存在的,且去除 两个集合的并集,并且不知道哪个是大集合和小集合。(该场景应用比较多。。)

 public static void main(String[] args) {
        String x = "a,b,c";
        String y = "a,b,c,d,e,f";
        String difSet = getDifSet(x, y);
        System.out.println(difSet);
    }
private static String getDifSet(String mores, String lesss) {
        String[] more = mores.split(",");
        String[] less = lesss.split(",");
        //将多转换为set fid 肯定不是小的
        Set<String> set = new HashSet<String>(Arrays.asList(more.length > less.length ? more : less));
        for (String p : less.length > more.length ? more:less) {
            // 如果集合里有相同的就删掉,如果没有就将值添加到集合
            if (set.contains(p)) {
                set.remove(p);
            }
        }
        return StringUtils.join(set.toArray(), ",");
}

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值