【java】Collection求交集

来源:互联网 发布:淘宝有异地客服吗 编辑:程序博客网 时间:2024/06/05 18:37

转载请注明出处: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值为:truelistdata1和listdata2求交集结果保存在listdata1中,交集结果如下:[1, 5]listdata3和listdata4求完交集后listdata3中的元素并未改变,因此boolean值为:falselistdata3和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常用操作(点击查看)