首页 > 编程语言 > 详细

Java里面如何求两个集合的交集

时间:2015-02-12 22:56:20      阅读:482      评论:0      收藏:0      [点我收藏+]

 在Python里,或许我们没有这个烦恼,因为python里已经为我们提供了intersection这样的方法。

     但是在Java里,就需要我们动一番脑筋了。这里浓重推荐下apache的CollectionUtils工具类。

 

 

     方法签名如下所示:

     org.apache.commons.collections.intersection(final Collection a, final Collection b)

 

     那么这个方法是怎么实现的呢?这里以list为例

 

     public class TestIntersection {

    private static final Integer ONE = new Integer(1);  

  1.   

  2.     public static void main(String[] args) {  

  3.         // a集合[a,a,b,b,b,c]  

  4.         List<String> a = Arrays.asList("a""a""b""b""b""c");  

  5.         // b集合[a,b,b,c,c]  

  6.         List<String> b = Arrays.asList("a""b""b""c""c");  

  7.         Map mapa = mapForCollection(a);  

  8.         Map mapb = mapForCollection(b);  

  9.         // 将两个集合里不重复的元素加进来,然后会依次遍历元素的出现次数  

  10.         Set set = new HashSet(a);  

  11.         set.addAll(b);  

  12.         List<String> result = new ArrayList<String>();  

  13.         for (Object obj : set) {  

  14.             for (int i = 0, m = Math.min(getCountsFromMap(obj, mapa), getCountsFromMap(obj, mapb)); i < m; i++) {  

  15.                 result.add((String) obj);  

  16.             }  

  17.         }  

  18.         // 看下期待的结果是不是[a,b,b,c]  

  19.         System.out.println(result);  

  20.   

  21.     }  

  22.   

  23.     /** 

  24.      * 循环遍历集合,并对每一个元素出现的次数计数<br/> 

  25.      * 最终返回类似于{A:1,B:3,C:3}这样的map 

  26.      *  

  27.      * @param a 

  28.      * @return  

  29.      */  

  30.     private static Map mapForCollection(Collection a) {  

  31.         Map map = new HashMap();  

  32.         Iterator it = a.iterator();  

  33.         while (it.hasNext()) {  

  34.             Object obj = it.next();  

  35.             Integer count = (Integer) map.get(obj);  

  36.             if (count == null) {  

  37.                 // 表明该元素第一次出现  

  38.                 map.put(obj, ONE);  

  39.             } else {  

  40.                 map.put(obj, new Integer(count.intValue() + 1));  

  41.             }  

  42.         }  

  43.         return map;  

  44.     }  

  45.   

  46.     private static int getCountsFromMap(Object obj, Map map) {  

  47.         Integer count = (Integer) map.get(obj);  

  48.         return count != null ? count.intValue() : 0;  

  49.     }  

  50. }  

 

    可以看到,先对两个不同的集合进行元素标记,并记下各自每个元素出现的次数,然后提取出两个集合中不重复的元素,

取两者中元素出现次数最少的数值,进行循环添加

Java里面如何求两个集合的交集

原文:http://my.oschina.net/airship/blog/378231

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!