日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Java中List集合對象去重及按屬性去重的8種方法

瀏覽:23日期:2022-08-25 13:21:03

Java中List集合對象去重及按屬性去重的8種方法

最近在寫一些關于java基礎的文章,但是我又不想按照教科書的方式去寫知識點的文章,因為意義不大。基礎知識太多了,如何將這些知識歸納總結,總結出優缺點或者是使用場景才是對知識的升華。所以我更想把java相關的基礎知識進行穿針引線,進行整體上的總結。

總結java中創建并寫文件的5種方式 總結java從文件中讀取數據的6種方法 總結java創建文件夾的4種方法及其優缺點 總結java中刪除文件或文件夾的7種方法 總結java中文件拷貝剪切的5種方式

比如之前我已經寫了上面的這些內容,如果對java基礎知識總結系列感興趣的同學可以關注我的博客(文末給出我的博客地址)。

一、本文梗概

這一篇文章我想寫一下List集合元素去重的8種方法,實際上通過靈活的運用、排列組合不一定是8種,可能有18種方法。

對象元素整體去重的4種方法 按照對象屬性去重的4種方法

為了在下文中進行測試內容講解,我們先做一些初始化數據

public class ListRmDuplicate { private List<String> list; private List<Player> playerList; @BeforeEach public void setup() { list = new ArrayList<>(); list.add('kobe'); list.add('james'); list.add('curry'); list.add('zimug'); list.add('zimug'); playerList= new ArrayList<>(); playerList.add(new Player('kobe','10000')); //科比萬歲 playerList.add(new Player('james','32')); playerList.add(new Player('curry','30')); playerList.add(new Player('zimug','27')); // 注意這里名字重復 playerList.add(new Player('zimug','18')); //注意這里名字和年齡重復 playerList.add(new Player('zimug','18')); //注意這里名字和年齡重復 }}

Player對象就是一個普通的java對象,有兩個成員變量name與age,實現了帶參數構造函數、toString、equals和hashCode方法、以及GET/SET方法。

二、集合元素整體去重

下文中四種方法對List中的String類型以集合元素對象為單位整體去重。如果你的List放入的是Object對象,需要你去實現對象的equals和hashCode方法,去重的代碼實現方法和List<String>去重是一樣的。

第一種方法

是大家最容易想到的,先把List數據放入Set,因為Set數據結構本身具有去重的功能,所以再將SET轉為List之后就是去重之后的結果。這種方法在去重之后會改變原有的List元素順序,因為HashSet本身是無序的,而TreeSet排序也不是List種元素的原有順序。

@Testvoid testRemove1() { /*Set<String> set = new HashSet<>(list); List<String> newList = new ArrayList<>(set);*/ //去重并排序的方法(如果是字符串,按字母表排序。如果是對象,按Comparable接口實現排序) //List<String> newList = new ArrayList<>(new TreeSet<>(list)); //簡寫的方法 List<String> newList = new ArrayList<>(new HashSet<>(list)); System.out.println( '去重后的集合: ' + newList);}

控制臺打印結果如下:

去重后的集合: [kobe, james, zimug, curry]

第二種方法

使用就比較簡單,先用stream方法將集合轉換成流,然后distinct去重,最后在將Stream流collect收集為List。

@Testvoid testRemove2() { List<String> newList = list.stream().distinct().collect(Collectors.toList()); System.out.println( '去重后的集合: ' + newList);}

控制臺打印結果如下:

去重后的集合: [kobe, james, curry, zimug]

第三種方法

這種方法利用了set.add(T),如果T元素已經存在集合中,就返回false。利用這個方法進行是否重復的數據判斷,如果不重復就放入一個新的newList中,這個newList就是最終的去重結果

//三個集合類list、newList、set,能夠保證順序@Testvoid testRemove3() { Set<String> set = new HashSet<>(); List<String> newList = new ArrayList<>(); for (String str :list) { if(set.add(str)){ //重復的話返回false newList.add(str); } } System.out.println( '去重后的集合: ' + newList);}

控制臺打印結果和第二種方法一致。

第四種方法

這種方法已經脫離了使用Set集合進行去重的思維,而是使用newList.contains(T)方法,在向新的List添加數據的時候判斷這個數據是否已經存在,如果存在就不添加,從而達到去重的效果。

//優化 List、newList、set,能夠保證順序@Testvoid testRemove4() { List<String> newList = new ArrayList<>(); for (String cd:list) { if(!newList.contains(cd)){ //主動判斷是否包含重復元素 newList.add(cd); } } System.out.println( '去重后的集合: ' + newList);}

控制臺打印結果和第二種方法一致。

三、按照集合元素對象屬性去重

其實在實際的工作中,按照集合元素對象整體去重的應用的還比較少,更多的是要求我們按照元素對象的某些屬性進行去重。看到這里請大家回頭去看一下上文中,構造的初始化數據playerList,特別注意其中的一些重復元素,以及成員變量重復。

第一種方法

為TreeSet實現Comparator接口,如果我們希望按照Player的name屬性進行去重,就去在Comparator接口中比較name。下文中寫了兩種實現Comparator接口方法:

lambda表達式:(o1, o2) -> o1.getName().compareTo(o2.getName()) 方法引用:Comparator.comparing(Player::getName)

@Testvoid testRemove5() { //Set<Player> playerSet = new TreeSet<>((o1, o2) -> o1.getName().compareTo(o2.getName())); Set<Player> playerSet = new TreeSet<>(Comparator.comparing(Player::getName)); playerSet.addAll(playerList); /*new ArrayList<>(playerSet).forEach(player->{ System.out.println(player.toString()); });*/ //將去重之后的結果打印出來 new ArrayList<>(playerSet).forEach(System.out::println);}

輸出結果如下:三個zimug因為name重復,另外兩個被去重。但是因為使用到了TreeSet,list中元素被重新排序。

Player{name=’curry’, age=’30’}Player{name=’james’, age=’32’}Player{name=’kobe’, age=’10000’}Player{name=’zimug’, age=’27’}

第二種方法

這種方法是網上很多的文章中用來顯示自己很牛的方法,但是在筆者看來有點脫了褲子放屁,多此一舉。既然大家都說有這種方法,我不寫好像我不牛一樣。我為什么說這種方法是“脫了褲子放屁”?

首先用stream()把list集合轉換成流 然后用collect及toCollection把流轉換成集合 然后剩下的就和第一種方法一樣了

前兩步不是脫了褲子放屁么?看看就得了,實際應用意義不大,但是如果是為了學習Stream流的使用方法,搞出這么一個例子還是有可取之處的。

@Testvoid testRemove6() { List<Player> newList = playerList.stream().collect(Collectors .collectingAndThen( Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(Player::getName))), ArrayList::new)); newList.forEach(System.out::println);}

控制臺打印輸出和第一種方法一樣。

第三種方法

這種方法也是筆者建議大家使用的一種方法,咋一看好像代碼量更大了,但實際上這種方法是應用比較簡單的方法。

Predicate(有人管這個叫斷言,從英文的角度作為名詞可以翻譯為謂詞,作為動詞可以翻譯為斷言)。謂詞就是用來修飾主語的,比如:喜歡唱歌的小鳥,喜歡唱歌就是謂詞,用來限定主語的范圍。所以我們這里是用來filter過濾的,也是用來限制主語范圍的,所以我認為翻譯為謂詞更合適。隨便吧,看你怎么覺得怎么理解合理、好記,你就怎么來。

首先我們定義一個謂詞Predicate用來過濾,過濾的條件是distinctByKey。謂詞返回ture元素保留,返回false元素被過濾掉。 當然我們的需求是過濾掉重復元素。我們去重邏輯是通過map的putIfAbsent實現的。putIfAbsent方法添加鍵值對,如果map集合中沒有該key對應的值,則直接添加,并返回null,如果已經存在對應的值,則依舊為原來的值。 如果putIfAbsent返回null表示添加數據成功(不重復),如果putIfAbsent返回value(value==null :false),則滿足了distinctByKey謂詞的條件元素被過濾掉。

這種方法雖然看上去代碼量增大了,但是distinctByKey謂詞方法只需要被定義一次,就可以無限復用。

@Testvoid testRemove7() { List<Player> newList = new ArrayList<>(); playerList.stream().filter(distinctByKey(p -> p.getName())) //filter保留true的值 .forEach(newList::add); newList.forEach(System.out::println);}static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) { Map<Object,Boolean> seen = new ConcurrentHashMap<>(); //putIfAbsent方法添加鍵值對,如果map集合中沒有該key對應的值,則直接添加,并返回null,如果已經存在對應的值,則依舊為原來的值。 //如果返回null表示添加數據成功(不重復),不重復(null==null :TRUE) return t -> seen.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;}

輸出結果如下:三個zimug因為name重復,另外兩個被去重。并且沒有打亂List的原始順序

Player{name=’kobe’, age=’10000’}Player{name=’james’, age=’32’}Player{name=’curry’, age=’30’}Player{name=’zimug’, age=’27’}

第四種方法

第四種方法實際上不是新方法,上面的例子都是按某一個對象屬性進行去重,如果我們想按照某幾個元素進行去重,就需要對上面的三種方法進行改造。我只改造其中一個,另外幾個改造的原理是一樣的,就是把多個比較屬性加起來,作為一個String屬性進行比較。

@Testvoid testRemove8() { Set<Player> playerSet = new TreeSet<>(Comparator.comparing(o -> (o.getName() + '' + o.getAge()))); playerSet.addAll(playerList); new ArrayList<>(playerSet).forEach(System.out::println);}

總結

到此這篇關于Java中List集合對象去重及按屬性去重的8種方法的文章就介紹到這了,更多相關java list集合去重內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
久久国产高清| 国产福利91精品一区二区| 亚洲二区三区不卡| 老鸭窝毛片一区二区三区| 少妇高潮一区二区三区99| 国产精品jk白丝蜜臀av小说| 精品久久福利| 五月综合激情| 性一交一乱一区二区洋洋av| 欧美亚洲tv| 电影亚洲精品噜噜在线观看| 免费日韩av| 久久超级碰碰| 免费av一区| 亚洲不卡视频| 国产专区精品| 久久高清免费观看| 精品一区二区三区的国产在线观看 | 欧美日一区二区| 蜜桃91丨九色丨蝌蚪91桃色| 久久久亚洲欧洲日产| 1000部精品久久久久久久久| 亚洲欧洲美洲国产香蕉| 精品国产乱码久久久| 99pao成人国产永久免费视频| 国产日韩欧美一区| 久久91导航| 日韩精品免费视频一区二区三区 | 久久在线91| 亚洲国内欧美| 日本视频一区二区| 99成人在线视频| 日韩国产欧美视频| 久久免费大视频| 青青国产91久久久久久| 色88888久久久久久影院| 日韩国产欧美视频| 欧美.日韩.国产.一区.二区| 国产毛片一区二区三区| 激情五月综合网| 麻豆成人综合网| 免费看欧美美女黄的网站| 麻豆91精品91久久久的内涵| 视频在线在亚洲| 9999国产精品| 日韩av中文字幕一区二区三区| 欧美freesex黑人又粗又大| 亚洲三级观看| 亚洲v在线看| 久久精品国产在热久久| 美女精品一区| 日韩一区二区三区在线免费观看| 91精品视频一区二区| 亚州av乱码久久精品蜜桃| 精品视频自拍| 日韩国产在线观看| 国产精品老牛| 国产一区二区三区精品在线观看| 在线精品一区二区| 亚洲黑丝一区二区| 国产suv精品一区二区四区视频 | 欧美国产亚洲精品| 亚洲影视一区| 蜜臀91精品国产高清在线观看 | av资源亚洲| 国产精品一页| 亚洲日韩视频| 亚洲少妇自拍| av资源亚洲| 精品久久网站| 国产精品porn| 国产情侣一区| 91精品国产自产精品男人的天堂| 亚洲欧美日韩国产综合精品二区| 91精品蜜臀一区二区三区在线 | 久久一区精品| 日韩综合一区二区| 亚洲一区日本| 欧美 日韩 国产精品免费观看| 国产成人精品福利| 国产精品久久久一区二区| 日韩一区二区三区精品| 视频在线观看91| 日韩午夜电影| 欧美日韩高清| 久久国产日本精品| av资源亚洲| 日韩综合精品| 欧美精品日日操| 日韩在线中文| 另类中文字幕国产精品| 国产一区一一区高清不卡| 久久丁香四色| 精品国产一区二区三区2021| 精品视频网站| 国产成人精品福利| 中文字幕一区久| 亚洲精品.com| 尤物tv在线精品| 韩日一区二区三区| 亚洲一区国产一区| 亚洲另类黄色| 偷拍亚洲精品| 国产欧美日韩精品一区二区免费 | 日本伊人午夜精品| 日韩欧美久久| 国产日韩高清一区二区三区在线| 国产免费av国片精品草莓男男| 国产精品久久久久av蜜臀| 国产精品三级| 精品国产亚洲一区二区在线观看| 精品高清久久| 樱桃视频成人在线观看| 久久精品99久久无色码中文字幕| 欧美日韩一区二区综合 | 欧美一级精品| 亚洲女同中文字幕| 欧美一级专区| 欧美一区91| 国内精品亚洲| 久久高清免费| 亚洲深夜av| 日韩av中文字幕一区二区| 国产精品videosex极品| аⅴ资源天堂资源库在线| 四虎884aa成人精品最新| 一区在线免费| 日韩精品成人在线观看| 国产精品亚洲四区在线观看 | 视频一区国产视频| 日韩不卡一区二区三区| 精品女同一区二区三区在线观看| 日韩视频网站在线观看| 亚洲欧美不卡| 国产精品日本一区二区三区在线| 四虎国产精品免费观看| 91精品一区国产高清在线gif| 9国产精品视频| 欧美一区激情| 日韩在线第七页| 亚洲有吗中文字幕| 牛牛精品成人免费视频| www.51av欧美视频| 国产毛片一区| 国产欧美自拍| 欧美丝袜一区| 天堂va欧美ⅴa亚洲va一国产| 久久99高清| 亚洲一区二区成人| 欧美国产极品| 国产一区日韩欧美| 亚洲精品女人| 国产一区日韩| 亚洲精品123区| 国产美女精品视频免费播放软件| 久久久久国产精品一区三寸| 亚洲精品伊人| 国产精品国产三级国产在线观看| 欧美日韩三区| 久久av网站| 亚洲一区二区毛片| 国内精品亚洲| 亚洲精品欧美| 日韩欧美一区二区三区免费观看| 亚洲乱亚洲高清| 婷婷综合六月| 国产三级精品三级在线观看国产| 欧美日韩水蜜桃| 国产欧美日韩综合一区在线播放| 久久精品导航| 国产日韩欧美中文在线| 激情丁香综合| 国产精品久av福利在线观看| 午夜免费一区| 视频在线不卡免费观看| 婷婷精品久久久久久久久久不卡| 欧美男人天堂| 国产欧美亚洲精品a| 99国产精品| 日韩av有码| 国产另类在线| 日韩影院免费视频| 亚洲成人一区在线观看| 国产无遮挡裸体免费久久| 亚洲欧美日韩专区| 日本精品不卡| 久久wwww| 免费在线观看一区二区三区| 91亚洲成人| 国产精品久久久久久久免费软件 | 日韩毛片网站| 欧美日韩国产探花| 国产成人精品一区二区免费看京 | 久久不卡国产精品一区二区| 视频一区二区国产| 天堂8中文在线最新版在线| 久久精品xxxxx| 综合一区在线| 亚洲一区欧美二区| 在线成人动漫av|