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

在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. public static void main(String[] args) {
  2. // a集合[a,a,b,b,b,c]
  3. List<String> a = Arrays.asList("a", "a", "b", "b", "b", "c");
  4. // b集合[a,b,b,c,c]
  5. List<String> b = Arrays.asList("a", "b", "b", "c", "c");
  6. Map mapa = mapForCollection(a);
  7. Map mapb = mapForCollection(b);
  8. // 将两个集合里不重复的元素加进来,然后会依次遍历元素的出现次数
  9. Set set = new HashSet(a);
  10. set.addAll(b);
  11. List<String> result = new ArrayList<String>();
  12. for (Object obj : set) {
  13. for (int i = 0, m = Math.min(getCountsFromMap(obj, mapa), getCountsFromMap(obj, mapb)); i < m; i++) {
  14. result.add((String) obj);
  15. }
  16. }
  17. // 看下期待的结果是不是[a,b,b,c]
  18. System.out.println(result);
  19. }
  20. /**
  21. * 循环遍历集合,并对每一个元素出现的次数计数<br/>
  22. * 最终返回类似于{A:1,B:3,C:3}这样的map
  23. *
  24. * @param a
  25. @return
  26. */
  27. private static Map mapForCollection(Collection a) {
  28. Map map = new HashMap();
  29. Iterator it = a.iterator();
  30. while (it.hasNext()) {
  31. Object obj = it.next();
  32. Integer count = (Integer) map.get(obj);
  33. if (count == null) {
  34. // 表明该元素第一次出现
  35. map.put(obj, ONE);
  36. } else {
  37. map.put(obj, new Integer(count.intValue() + 1));
  38. }
  39. }
  40. return map;
  41. }
  42. private static int getCountsFromMap(Object obj, Map map) {
  43. Integer count = (Integer) map.get(obj);
  44. return count != null ? count.intValue() : 0;
  45. }
  46. }

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

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

时间: 2024-10-07 05:16:54

Java里面如何求两个集合的交集的相关文章

求两个集合的交集和并集C#

我是用hashset<T>来实现的 具体如代码所示 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace JiaoJi { class Program { static void Main(string[] args) { int [] arrA=new int[8]{1,2,3,4,5,6,7,8}; int [] arrB=new int[5]{4,5,

java使用bitmap求两个数组的交集

先实现一个bitmap /** * @Description: * @author: zhoum * @Date: 2020-01-23 * @Time: 10:49 */ public class BitMap { private int[] sign = {0x00000001,0x00000002,0x00000004,0x00000008,0x00000010,0x00000020,0x00000040,0x00000080,0x00000100,0x00000200,0x0000040

java求两个集合的差集

public static void main(String[] args) {Set set = new HashSet();Set set1 = new HashSet();set.add("sanny");set.add("mary");set.add("bill");set.add("tom");set.add("tony");set.add("mark");set.add(&q

计算两个集合的交集数字(java)

循环判断2个数组 将相同的公共元素复制到新数组中即可 1 2 3 import java.util.Arrays; 4 5 public class count_same_number { 6 7 public static int[] join(int[] a,int[] b) 8 { 9 int count=0; 10 int new_target[]=new int[Math.max(a.length, b.length)];//新数组 11 int index=0; 12 for(int

Java求两个List的交集

1 package demo; 2 3 import java.util.List; 4 5 public class Demo { 6 7 @SuppressWarnings("unchecked") 8 public static void main(String[] args) { 9 List array1=new ArrayList(); 10 array1.add("1");array1.add("2"); 11 List array

用顺序表实现求两个集合的并集

#include<iostream.h> #include<malloc.h> #include<limits.h> #include<string.h> #include<stdlib.h> #include<ctype.h> #include<stdlib.h> #include<process.h> #define OK 1 #define INIT_LiST_SIZE 100//顺序表的初始长度 #de

求两个数组的交集

问题: 给你两个排序的数组,求两个数组的交集. 比如: A = 1 3 4 5 7, B = 2 3 5 8 9, 那么交集就是 3 5. 思路: 1. 每一次从B数组中取一值,然后在A数组里逐个比较,如果有相等的,则保存.该算法复杂度为 O(MN). M, N 分别为数组 A B 的长度. 2. 因为A B 都排过序,所以,每一次从B数组取值后,可以利用二分查找看是否在数组A里有B所对应的值,这样复杂度变成了O(N lg M). 这里,如果N 比 M 大,可以从A中取值,然后在B中判断是否有A

哈希(4) - 求两个链表的交集(intersection)以及并集(union)

给定两个链表,求它们的交集以及并集.用于输出的list中的元素顺序可不予考虑. 例子: 输入下面两个链表: list1: 10->15->4->20 list2: 8->4->2->10 输出链表: 交集list: 4->10 并集list: 2->8->20->4->15->10 方法1 (简单方法) 可以参考链表系列中的"链表操作 - 求两个链表的交集(intersection)以及并集(union)" 方法2

mysql获取两个集合的交集和差集

mysql中获取两个集合的交集,我的方法如下: 1.两个集合的结构要一致,对应的字段数,字段类型 2.将两个集合用 UNION ALL 关键字合并,这里的结果是有重复的所有集 3.将上面的所有集 GROUP BY id 4.最后 HAVING COUNT(id)=1,等于1的意思是只出现了一次,所以这个是差集,如果等于2,那么就是交集 这是实现的基本原理,具体如下: 1 -- 下面的sql有明显的问题,不过这个只是一个示意,从一个表中查询不需要用到交集和差集,条件可以合并在一起直接查询出来的.能