【java】Collection求交集

转载请注明出处:http://blog.csdn.net/u012250875/article/details/78201566

一、使用Collection接口定义的方法

//Collection接口中定义的
boolean retainAll(Collection<?> c);

调用方式如下:

//使用如下:
public static void main(String[] args) {
    List<Integer> listdata1 = new ArrayList<>(Arrays.asList(new Integer[]{1,5,7}));
        List<Integer> listdata2 = new ArrayList<>(Arrays.asList(new Integer[]{1,3,5}));
        System.out.println("listdata1和listdata2求完交集后listdata1中元素发生改变了,因此boolean值为:"+listdata1.retainAll(listdata2));
        System.out.println("listdata1和listdata2求交集结果保存在listdata1中,交集结果如下:"+listdata1);

        List<Integer> listdata3 = new ArrayList<>(Arrays.asList(new Integer[]{1,5,7}));
        List<Integer> listdata4 = new ArrayList<>(Arrays.asList(new Integer[]{1,5,7}));
        System.out.println("listdata3和listdata4求完交集后listdata3中的元素并未改变,因此boolean值为:"+listdata1.retainAll(listdata2));
        System.out.println("listdata3和listdata4求交集结果保存在listdata3中,交集结果如下:"+listdata3);
}

执行结果如下

listdata1和listdata2求完交集后listdata1中元素发生改变了,因此boolean值为:true
listdata1和listdata2求交集结果保存在listdata1中,交集结果如下:[1, 5]
listdata3和listdata4求完交集后listdata3中的元素并未改变,因此boolean值为:false
listdata3和listdata4求交集结果保存在listdata3中,交集结果如下:[1, 5, 7]

特别注意:
retainAll方法返回的boolean值表示retainAll调用者(listdata1和listdata3)中元素是否发生变化了,而与两个集合是否存在交集无关,判断两个集合是否存在交集可以判断retainAll调用后调用者的size大小是否为0(listdata1.size(),listdata3.size()),为0表示无交集。

二、封装求交集的工具方法

    /**
     * @author puyf
     * @Description:集合类求交集
     * @param datas
     * @return
     */
    public static <T,K extends Collection<? extends T>> List<T> intersection(Collection<K> datas){
        List<T> result = new ArrayList<>();
        Iterator<K> it = datas.iterator();
        if(it.hasNext()){
            K copy = it.next();
            if(copy!=null){
                result = new ArrayList<>(copy);
                for (K k : datas) {
                    result.retainAll(k);
                }   
            }
        }
        return result;
    }

    /**
     * @author puyf
     * @Description:集合类求交集
     * @param datas
     * @return
     */
    public static <T,K extends Collection<? extends T>> List<T> intersection(K...datas){
        return intersection(Arrays.asList(datas));
    }

封装时,入参采用规定为集合类的集合或集合类可变参数,这样可以扩大了入参范围,凡是满足Collection<Collection<T>>皆可作为入参,采用Collection<? extends T>则允许入参的泛型只要继承关系即可不用严格一致

使用如下:

public static void main(String[] args) {
        List<Number> listdata1 = new ArrayList<>(Arrays.asList(new Integer[]{1,5,7}));
        List<Integer> listdata2 = new ArrayList<>(Arrays.asList(new Integer[]{1,3,5}));
        Set<Integer> setdata = new HashSet<>(Arrays.asList(new Integer[]{1,3,9}));
        System.out.println("listdata1、listdata2、setdata三者求交集,交集结果  为:"+intersection(listdata1,listdata2,setdata));
}

执行结果:

listdata1listdata2setdata三者求交集,交集结果为:[1, 5, 7]

上述调用中可体现支持set和list混用,支持泛型继承(Integer继承自Number)

更多:Collection常用操作(点击查看

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值