java判断两集合是否相同以及求取交集,并集,差集

业务中用时需要判断两集合是否相同,所有提供一个工具方法,使用set集合的特性(元素唯一):

private Map<String,Set<Integer>> getCategoryApiId(Set<Integer> oldAuthSet , Set<Integer> newAuthSet){
        Map<String,Set<Integer>> categoryApiId = new HashMap();
        if (oldAuthSet!=null&&newAuthSet!=null){
            //首先判断两个集合是否一致
            if (oldAuthSet.size()==newAuthSet.size()){
                Set<Integer> tempSet = new HashSet<Integer>();
                tempSet.addAll(oldAuthSet);
                tempSet.addAll(newAuthSet);
                if (tempSet.size()==oldAuthSet.size()){
                    categoryApiId =null;//未增加api个数
                    logger.info("未新增和删除api");
                }else{
                    //1:交集;2:a-b的差集;3:并集
                    Set<Integer> apiSet1 = getApiSet(oldAuthSet, newAuthSet, 1);
                    Set<Integer> deleteAuthSet = getApiSet(oldAuthSet, apiSet1, 2);
                    Set<Integer> insertAuthSet = getApiSet(newAuthSet,oldAuthSet , 2);//获取新增的apiId
                    logger.info("删除的api:"+deleteAuthSet);
                    logger.info("新增的api:"+insertAuthSet);
                    categoryApiId.put("insertApi",insertAuthSet);
                    categoryApiId.put("datele",deleteAuthSet);
                }
            }else{
                //1:交集;2:a-b的差集;3:b-a的差集;4:并集
                Set<Integer> apiSet1 = getApiSet(oldAuthSet, newAuthSet, 1);
                Set<Integer> deleteAuthSet = getApiSet(oldAuthSet, apiSet1, 2);//获取删除的apiId
                Set<Integer> insertAuthSet = getApiSet(newAuthSet, oldAuthSet, 2);//获取新增的apiId
                logger.info("删除的api:"+deleteAuthSet);
                logger.info("新增的api:"+insertAuthSet);
                categoryApiId.put("insertApi",insertAuthSet);
                categoryApiId.put("datele",deleteAuthSet);
            }
        }else{
            if (oldAuthSet==null&&newAuthSet!=null){    //全是新增api
                logger.info("首次新增授权api");
                categoryApiId.put("insertApi",newAuthSet);
            }else if (oldAuthSet!=null&&newAuthSet==null){  //未修改用户授权api的数据
                logger.info("未增加新授权的api");
                categoryApiId.put("datele",oldAuthSet);
            }else if (oldAuthSet==null&&newAuthSet==null){
                logger.info("已授权api和新增授权api都为空");
                categoryApiId =null;
            }
        }
        return categoryApiId;
    }

private Set<Integer>  getApiSet(Set<Integer> oldAuthSet, Set<Integer> newAuthSet,int flag) {
        Set<Integer> result = new HashSet<Integer>();
        if(flag==1){ //求交集
            result.clear();
            result.addAll(oldAuthSet);
            result.retainAll(newAuthSet);
        }else if(flag==2){ //求差集
            result.clear();
            result.addAll(oldAuthSet);
            result.removeAll(newAuthSet);
        } else if (flag==3){ //求并集
            result.clear();
            result.addAll(oldAuthSet);
            result.addAll(newAuthSet);
        }
        return result;
    }

原文地址:https://www.cnblogs.com/zyanrong/p/11791508.html

时间: 2024-08-08 07:07:43

java判断两集合是否相同以及求取交集,并集,差集的相关文章

Python 求两个文本文件以行为单位的交集 并集 差集

Python 求两个文本文件以行为单位的交集 并集 差集,来代码: s1 = set(open('a.txt','r').readlines()) s2 = set(open('b.txt','r').readlines()) print 'ins: %s'%(s1.intersection(s2)) print 'uni: %s'%(s1.union(s2)) print 'dif: %s'%(s1.difference(s2).union(s2.difference(s1))) 原文地址:h

java 判断两个时间相差的天数!

package com.datedaycha;     import java.text.SimpleDateFormat;     import java.util.Calendar;     import java.util.Date;     import com.sun.org.apache.xerces.internal.impl.xpath.regex.ParseException;     /*      * java 判断两个时间相差的天数     1.实现目标     输入:两

Java判断两个路径对应的文件是否相同

今天遇到一个bug,查了一个小时才发现是文件路径比较出了问题: 比如有两个路径:D:\dir\..\a.txt和D:\a.txt.这两个路径写法虽然不同,但是很容易知道这两个路径指向的是同一个文件.如果我们使用Java的File去判断两个路径是否相同,判断如下: File f1 = new File("D:\\dir\\..\\a.txt"); File f2 = new File("D:\\a.txt"); System.out.println(f1.getAbs

&lt;笔试&gt;&lt;面试&gt;C/C++单链表相关(4)判断两链表是否相交,求交点(链表不带环/可能带环)

判断两链表是否相交,求交点(假设链表不带环) 判断两链表是否相交,求交点(假设链表可能带环) RingEntry_Point()等函数见前篇. SListNode* Intersect(SListNode *&L, SListNode *&M)//判断两链表是否相交,求交点(假设链表不带环) {  //思路:若不带环,只有相交/不想交两种情况  // 与RingEntry_Point()函数方法相同:  //     求两个链表长度之差K,再令一个指针从长链表开始先走K步,令另一个指针从短

判断两个矩形相交以及求出相交的区域

问题:给定两个矩形A和B,矩形A的左上角坐标为(Xa1,Ya1),右下角坐标为(Xa2,Ya2),矩形B的左上角坐标为(Xb1,Yb1),右下角 坐标为(Xb2,Yb2).(1)设计一个算法,确定两个矩形是否相交(即有重叠区域)(2)如果两个矩形相交,设计一个算法,求出相交的区域矩形 (1)       对于这个问题,一般的思路就是判断一个矩形的四个顶点是否在另一个矩形的区域内.这个思路最简单,但是效率不高,并且存在错误,错误在哪里,下面分析一 下. 如上图,把矩形的相交(区域重叠)分成三种(可

java 判断两个文件是否相同

使用java 如何判断两个文件是否相同呢? 我的做法是 (1)先比较两个文件内容的长度: (2)在长度相同的情况下,再比较两个文件的MD5值. [create md5]按钮用于记录source file的文件内容长度和MD5值. 运行主类:CheckSameApp package com.hw.main; import java.awt.BorderLayout;import java.awt.Container;import java.awt.Dimension;import java.awt

Java判断两个对象是否相等的规则

Object类中的equals方法用于检测一个对象是否等于另外一个对象.在Object类中,这个方法将判断两个对象是否具有相同的引用.如果两个对象具有相同的引用,它们一定是相等的.从这点上看,将其作为默认操作也是合情合理的.然而对于多数类来说,这种判断并没有什么意义.例如,采用这种方式比较两个PrintStream对象是否相等就完全没有意义.然而,经常需要检测两个对象状态的相等性,如果两个对象的状态相等,就认为这两个对象是相等的. 例如,如果两个雇员对象的姓名.薪水和雇佣日期都一样,就认为它们是

Java 判断两个对象是否相等

一.使用 == 与 equals == : 它的作用是判断两个对象的地址是不是相等.即,判断两个对象是不是同一个对象.(基本数据类型==比较的是值,引用数据类型==比较的是内存地址) equals() : 它的作用也是判断两个对象是否相等.但它一般有两种使用情况: 情况1:类没有覆盖equals()方法.则通过equals()比较该类的两个对象时,等价于通过"=="比较这两个对象. 情况2:类覆盖了equals()方法.一般,我们都覆盖equals()方法来两个对象的内容相等:若它们的

java判断两个时间相差得天数

方法一:通过Calendar类得日期比较,在这需要考虑闰年和平年,也要考虑跨年份 /** * date2比date1多的天数 * @param date1 * @param date2 * @return */ public static int differentDays(Date date1,Date date2) { Calendar cal1 = Calendar.getInstance(); cal1.setTime(date1); Calendar cal2 = Calendar.g