集合的交、并、差集操作及扩展(对两个数据源的信息根据key进行合并)

 

集合的交、并、差集操作及扩展(对两个数据源的信息进行合并根据key)

测试代码

 

public class SetHandleTest {


    //差集:以属于A而不属于B的元素为元素的集合称为A与B的差(集)

    public static void main(String[] args) {
        //baseHandle();
        mergeInfoByKey();
    }

    /**
     * 集合的交、并、差集
     */
    //TreeSet和LinkedHashSet的区别
    private static void baseHandle(){
        //1 准备基础数据,如果要按添加顺序排列,使用 LinkedHashSet
        Set<String> setOne = new HashSet<>();
        setOne.add("钱二");
        setOne.add("张三");
        setOne.add("李四");
        Set<String> setTwo = new TreeSet<>();
        setTwo.add("李四");
        setTwo.add("王五");
        setTwo.add("赵六");

        //2 对集合进行操作
        //2.1 取并集
        //setOne.addAll(setTwo);
        //System.out.println(setOne);
        //结果: [张三, 李四, 王五, 赵六, 钱二]

        //2.2 取交集
        //setOne.retainAll(setTwo);
        //System.out.println(setOne);
        //结果: [李四]

        //2.3 取一和二的差集(保留一集合中与二集合不同的元素)
        setOne.removeAll(setTwo);
        System.out.println(setOne);
        //结果: [张三, 钱二]
    }

    /**
     * 合并两个数据来源的信息(相同key的,信息汇总,其他的保留原有的信息)
     */
    private static void mergeInfoByKey(){

        //1 准备基础数据
        Map<Long, String> mapA= new HashMap<>();
        mapA.put(1L,"1A");
        mapA.put(2L,"1A");
        mapA.put(3L,"1A");
        Map<Long, String> mapB = new HashMap<>();
        mapB.put(1L,"1B");
        mapB.put(12L,"1B");
        mapB.put(13L,"1B");
        //2 定义返回对象收集器
        Map<Long, String> resultMap = new HashMap<>();
        //3 判断
        //3.1 都不为空,两个信息源的信息合并(关键点)
        if (!CollectionUtils.isEmpty(mapA)&&!CollectionUtils.isEmpty(mapB)){
            //3.1.1 准备进行交,差集操作的集合
            Set<Long> setOneA = new HashSet<>(mapA.keySet());
            Set<Long> setTwoA = new HashSet<>(mapA.keySet());
            Set<Long> setThreeA = new HashSet<>(mapA.keySet());

            Set<Long> setOneB = new HashSet<>(mapB.keySet());
            Set<Long> setTwoB = new HashSet<>(mapB.keySet());
            Set<Long> setThreeB = new HashSet<>(mapB.keySet());

            //取交集
            setOneA.retainAll(setOneB);
            System.out.println(setOneA);

            //取a和b的差集
            setTwoA.removeAll(setTwoB);
            //System.out.println(setTwoA);

            //取b和a的差集
            setThreeB.removeAll(setThreeA);
            //System.out.println(setThreeB);

            //信息合并
            for (Long key : setOneA) {
                String value=mapA.get(key)+":"+mapB.get(key);
                resultMap.put(key,value);
            }
            for (Long key : setTwoA) {
                resultMap.put(key,mapA.get(key));
            }
            for (Long key : setThreeB) {
                resultMap.put(key,mapB.get(key));
            }
        }
        //3.2 b信息源为空,a信息源不为空,那么只要a信息源的
        if (!CollectionUtils.isEmpty(mapA)&&CollectionUtils.isEmpty(mapB)){
            resultMap.putAll(mapA);
        }
        //3.2 a信息源为空,b信息源不为空,那么只要b信息源的
        if (CollectionUtils.isEmpty(mapA)&&!CollectionUtils.isEmpty(mapB)){
            resultMap.putAll(mapB);
        }
        for (Map.Entry<Long, String> entry : resultMap.entrySet()) {
            System.out.println("key:"+entry.getKey()+",value:"+entry.getValue());
        }
    }

 

posted @ 2022-01-20 18:48  进击的小蔡鸟  阅读(185)  评论(0编辑  收藏  举报