转载请注明出处: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));
}
执行结果:
listdata1、listdata2、setdata三者求交集,交集结果为:[1, 5, 7]
上述调用中可体现支持set和list混用,支持泛型继承(Integer继承自Number)
更多:Collection常用操作(点击查看)