CollectionUtils.intersection 男娘i 2024-03-22 09:44 33阅读 0赞 ## CollectionUtils.intersection ## ### CollectionUtils.intersection ### * 今天看了下公司的同事的代码,发现中间有使用 * Collection<String> intersection = CollectionUtils.intersection(a, b); * 简单看了一下源码,网上也了解到是取集合的交集,但是有一个小坑的地方,需要注意,源码如下: * public static Collection intersection(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.min(getFreq(obj,mapa),getFreq(obj,mapb));i<m;i++) { list.add(obj); } } return list; } * getCardinalityMap 方法将集合转换为Map,key为实例,value为出现的次数 * public static Map getCardinalityMap(final Collection coll) { Map count = new HashMap(); for (Iterator it = coll.iterator(); it.hasNext();) { Object obj = it.next(); Integer c = (Integer) (count.get(obj)); if (c == null) { count.put(obj,INTEGER_ONE); } else { count.put(obj,new Integer(c.intValue() + 1)); } } return count; } * 那么将两个集合分别转换为这样的一个Map,两个集合一起存在Set中,遍历Set,getFreq()就是获取该对象出现次数,那么就会出现Math.min得出在两个集合中都出现的最少的次数,会大于1,这时候输出的集合中,也会出现这么多次数,于是我验证了一下 * public static void main(String[] args) { String[] arrayA = new String[] { "1", "2", "3", "3","3", "4", "5" }; String[] arrayB = new String[] { "3", "4", "4", "5", "6","3", "7" ,"3" , "3" }; List<String> a = Arrays.asList(arrayA); List<String> b = Arrays.asList(arrayB); Collection<String> intersection = CollectionUtils.intersection(a, b); System.out.println( ArrayUtils.toString(intersection.toArray())); } * 结果 * {3,3,3,5,4} * 因为3在集合 arrayA 中中出现3次,集合 arrayB 出现4 次,那么最终会遍历出现3次。如果源码 while 中这样改一下,就不会重复了 * while(it.hasNext()) { Object obj = it.next(); if (Math.min(getFreq(obj,mapa),getFreq(obj,mapb)) > 0){ list.add(obj); } } * 那么输出结果就是 * {3,5,4} * 或者我们接收的时候转换为Set也可以达到去重的效果。
还没有评论,来说两句吧...