Java Apache CollectionUtils 源码阅读笔记,注意3.2版本bug
2016-10-30 11:45
555 查看
union并集
以下是部分方法,并非是所有方法。//通过set将a、b集合合并,如果某个对象在两个集合中出现,则新集合中该对象的数量取两个集合中该对象出现次数的较大数。 public static Collection union(final Collection a, final Collection b) { ArrayList list = new ArrayList(); Map mapa = getCardinalityMap(a);//对象以及出现次数的map Map mapb = getCardinalityMap(b);//对象以及出现次数的map Set elts = new HashSet(a); elts.addAll(b); Iterator it = elts.iterator(); while(it.hasNext()) { Object obj = it.next(); for(int i=0,m=Math.max(getFreq(obj,mapa),getFreq(obj,mapb));i<m;i++) { list.add(obj); } } return list; }
intersection 交集
代码基本同union,区别:将a、b集合合并,如果某个对象在两个集合中出现,则新集合中该对象的数量取两个集合中该对象出现次数的较小数。
retainAll 交集
retainAll方法用于从collection中去除不包含在retain中的元素,retain是要保留的元素。public static Collection retainAll(Collection collection, Collection retain) { return ListUtils.retainAll(collection, retain); } public static List retainAll(Collection collection, Collection retain) { List list = new ArrayList(Math.min(collection.size(), retain.size())); for (Iterator iter = collection.iterator(); iter.hasNext();) { Object obj = iter.next(); if (retain.contains(obj)) { list.add(obj); } } return list; }
removeAll 大bug
(在3.2版本中)其实现居然和retainAll一致,完全不是其描述的功能。慎用!不过在4.0版本已经修复。
其功能是用来从一个集合中删除另外一个集合中出现的元素。
disjunction 析取
代码基本同union,区别: 如果某个对象在两个集合中出现,则新集合中该对象的数量取两个集合中该对象出现次数的差。举例:
A: {1,2,2,2,3,3,4,5}
B: {3,4,4,5,6,7}
Disjunction: {1,2,2,2,3,4,6,7}
public static Collection disjunction(final Collection a, final Collection b) { ArrayList list = new ArrayList(); Map mapa = getCardinalityMap(a); Map mapb = getCardinalityMap(b); Set elts = new HashSet(a); elts.addAll(b); Iterator it = elts.iterator(); while(it.hasNext()) { Object obj = it.next(); for(int i=0,m=((Math.max(getFreq(obj,mapa),getFreq(obj,mapb)))-(Math.min(getFreq(obj,mapa),getFreq(obj,mapb))));i<m;i++) { list.add(obj); } } return list; }
subtract方法
将a集合中的b集合元素全部去除,代码略getCardinalityMap方法
获取集合中每个元素出现的次数map。isSubCollection
如果 a是b的一个子集,返回true,注意,如果是子集需要满足,对于某个元素,b中的个数大于等于a中的格式。代码略cardinality
obj 在集合中出现的次数forAllDo闭包使用
public static void forAllDo(Collection collection, Closure closure) { if (collection != null && closure != null) { for (Iterator it = collection.iterator(); it.hasNext();) { closure.execute(it.next()); } } }
filter、find
通过实现Predicate接口的一个方法,根据返回值去过滤或者查找某个objtransform、collect
通过实现Transformer接口的一个方法,对每一个obj做方法内规定的操作。对于一个collection,会被转换为一个list,对于list 会调用transform方法,对于非list的集合会调用collect方法
相关文章推荐
- apache1.3.39源码alloc.c阅读笔记
- Apache Storm源码阅读笔记
- java并发包源码阅读笔记(1)-AQS源码研究
- java集合源码阅读笔记-HashMap
- JAVA源码笔记(jdk 1.7.0_75)--Thread-精简版本
- apache1.3.39源码alloc.c阅读笔记
- Linux kernel源码阅读笔记2-2.6版本调度器sched.c功能
- java String 源码阅读笔记以及Unicode的学习
- 源码阅读笔记:java.lang.Object
- 【Android源码阅读系列一】一个bug引发的血案:阅读Android源码 MeasureSpec类(API版本:23)
- Apache mahout 源码阅读笔记--协同过滤, PearsonCorrelationSimilarity
- Java框架类源码阅读学习笔记
- apache1.3.39源码alloc.c阅读笔记
- Apache Spark源码走读之1 -- Spark论文阅读笔记
- Apache mahout 源码阅读笔记-DataModel之UserBaseRecommender
- [java,spring] spring 源码阅读笔记1
- Java集合源码阅读笔记-LinkedList
- JAVA源码笔记(jdk 1.7.0_75)--Thread-详细版本