JAVA——兩個List集合求交集、並集和差集(去重)模板

技術公衆號:後端技術解憂鋪
關注微信公衆號:CodingTechWork,一起學習進步。

引言

  經常遇到一些集合類之間的過濾數據、求合集之類的問題,在此以List爲例,畢竟在數據庫中取數據後,我們使用比較多的是List集合進行操作。

模板

代碼

public static void main(String[] args) {
        List<String> stringList = new ArrayList<>();
        stringList.add("a");
        stringList.add("b");
        stringList.add("c");
        stringList.add("i");
        stringList.add("j");
        stringList.add("a");

        //一、求交集
        //方法1:直接通過retainAll直接過濾
        List<String> stringList1 =  new ArrayList<>(Arrays.asList("a,b,c,d,e,f,g,h".split(",")));
        stringList1.retainAll(stringList);
        System.out.println("交集1: " + stringList1);

        //方法2:通過過濾掉存在於stringList的數據
        List<String> stringList1_2 = new ArrayList<>(Arrays.asList("a,b,c,d,e,f,g,h".split(",")));
        List<String> strings = stringList1_2.stream()
                .filter(item -> stringList.contains(item))
                .collect(toList());
        System.out.println("交集2:" + strings);

        //二、並集
        //有重並集
        List<String> stringList2 =  new ArrayList<>(Arrays.asList("a,b,c,d,e,f,g,h".split(",")));
        stringList2.addAll(stringList);
        System.out.println("並集: " + stringList2);

        //無重並集
        List<String> stringList2_2 =  new ArrayList<>(Arrays.asList("a,b,c,d,e,f,g,h".split(",")));
        List<String> stringList_1 =  new ArrayList<>(Arrays.asList("a,b,c,i,j,a".split(",")));
        stringList2_2.removeAll(stringList_1);
        stringList_1.addAll(stringList2_2);

        System.out.println("無重並集: " + stringList_1);

        //三、求差集
        //方法1:直接使用removeAll()方法
        List<String> stringList3 =  new ArrayList<>(Arrays.asList("a,b,c,d,e,f,g,h".split(",")));
        stringList3.removeAll(stringList);
        System.out.println("差集1: " + stringList3);

        //方法2:通過過濾掉不存在於stringList的數據,然後和本數組進行交集處理
        List<String> stringList3_2 = new ArrayList<>(Arrays.asList("a,b,c,d,e,f,g,h".split(",")));
        stringList3_2.retainAll(stringList3_2.stream()
                .filter(item -> !stringList.contains(item))
                .collect(toList()));
        System.out.println("差集2:" + stringList3_2);

        SpringApplication.run(DemoApplication.class, args);
    }

結果

交集1: [a, b, c]
交集2:[a, b, c]
並集: [a, b, c, d, e, f, g, h, a, b, c, i, j, a]
無重並集: [a, b, c, i, j, a, d, e, f, g, h]
差集1: [d, e, f, g, h]
差集2:[d, e, f, g, h]

注意list賦值問題

  如果使用了賦值方式,如list1 = list0,然後list1.retainAll(list2)或者list1.removeAll(list2)其實list0的值也變化了。因爲lis1和list0指向了同一個地址。
代碼

        List<String> s1 = new ArrayList<>(Arrays.asList("a,b,c,d,e,f,g,h".split(",")));
        List<String> s2 = s1;
        System.out.println("s1地址和s2是否相等(是否爲同一個對象): " + (s1 == s2));
        s2.remove("g");
        s2.remove("h");
        System.out.println("s1: " + s1);
        System.out.println("s2: " + s2);

結果

s1地址和s2是否相等(是否爲同一個對象): true
s1: [a, b, c, d, e, f]
s2: [a, b, c, d, e, f]

所以我們需要使用 List<String> list1= new ArrayList<>(list0);的方式
代碼

        List<String> s1 = new ArrayList<>(Arrays.asList("a,b,c,d,e,f,g,h".split(",")));
        List<String> s2 = new ArrayList<>(s1);
        System.out.println("s1地址和s2是否相等(是否爲同一個對象): " + (s1 == s2));
        s2.remove("g");
        s2.remove("h");
        System.out.println("s1: " + s1);
        System.out.println("s2: " + s2);

結果

s1地址和s2是否相等(是否爲同一個對象): false
s1: [a, b, c, d, e, f, g, h]
s2: [a, b, c, d, e, f]

  同時,我們1在使用removeAll()方法時,有時候會遇到報錯或者失效的情形,比如List中是一個一個對象類,且沒有重寫過equals和hashCode方法,就會帶來這種不相等的情況,從而導致失效,這個問題也要注意一下。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章