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

關(guān)注:CodingTechWork手报,一起學(xué)習(xí)進(jìn)步蚯舱。

引言

??經(jīng)常遇到一些集合類之間的過濾數(shù)據(jù)改化、求合集之類的問題,在此以List為例枉昏,畢竟在數(shù)據(jù)庫中取數(shù)據(jù)后陈肛,我們使用比較多的是List集合進(jìn)行操作。

模板

代碼

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的數(shù)據(jù)
        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的數(shù)據(jù)晰奖,然后和本數(shù)組進(jìn)行交集處理
        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);
    }

結(jié)果

交集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)其實(shí)list0的值也變化了畅涂。因?yàn)閘is1和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);

結(jié)果

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);

結(jié)果

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

??同時(shí),我們1在使用removeAll()方法時(shí)午衰,有時(shí)候會遇到報(bào)錯或者失效的情形立宜,比如List中是一個一個對象類,且沒有重寫過equals和hashCode方法臊岸,就會帶來這種不相等的情況橙数,從而導(dǎo)致失效,這個問題也要注意一下帅戒。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末灯帮,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子逻住,更是在濱河造成了極大的恐慌钟哥,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瞎访,死亡現(xiàn)場離奇詭異腻贰,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)扒秸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進(jìn)店門播演,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人伴奥,你說我怎么就攤上這事写烤。” “怎么了拾徙?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵洲炊,是天一觀的道長。 經(jīng)常有香客問我,道長选浑,這世上最難降的妖魔是什么蓝厌? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮古徒,結(jié)果婚禮上拓提,老公的妹妹穿的比我還像新娘。我一直安慰自己隧膘,他們只是感情好代态,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著疹吃,像睡著了一般蹦疑。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上萨驶,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天歉摧,我揣著相機(jī)與錄音,去河邊找鬼腔呜。 笑死叁温,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的核畴。 我是一名探鬼主播膝但,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼谤草!你這毒婦竟也來了跟束?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤丑孩,失蹤者是張志新(化名)和其女友劉穎冀宴,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體温学,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡花鹅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了枫浙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡古拴,死狀恐怖箩帚,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情黄痪,我是刑警寧澤紧帕,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響是嗜,放射性物質(zhì)發(fā)生泄漏愈案。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一鹅搪、第九天 我趴在偏房一處隱蔽的房頂上張望站绪。 院中可真熱鬧,春花似錦丽柿、人聲如沸恢准。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽馁筐。三九已至,卻和暖如春坠非,著一層夾襖步出監(jiān)牢的瞬間敏沉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工炎码, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留盟迟,地道東北人。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓辅肾,卻偏偏與公主長得像队萤,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子矫钓,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容