問題
上次堆疊長給大家分享了《帶了一個 3 年的開發,不會回圈洗掉 List 中的元素,我簡直崩潰!!》,上次也給大家留了個小話題:
怎么去除 List<String> 中的重復元素呢?
雖然兩個話題差不多,但實作起來就大相徑庭了,廢話少說,來看看都有哪些實作方式,這僅是我個人的實作方案,不一定全,也不一定是最優的,歡迎大家拍磚,
List 去重方案
假設有以下資料:
/**
* 3 個張三,2 個李強
*/
public List<String> initList = Arrays.asList(
"張三",
"李四",
"張三",
"周一",
"劉四",
"李強",
"李白",
"張三",
"李強",
"王五"
);
本文所有完整示例源代碼已經上傳:
https://github.com/javastacks/javastack
歡迎 Star 學習,后面 Java 示例都會在這上面提供!
1、for 回圈添加去重
/**
* for 回圈添加去重
* @author: 堆疊長
* @from: 公眾號Java技術堆疊
*/
@Test
public void remove1() {
List<String> list = new ArrayList(initList);
List<String> list2 = new ArrayList<>();
for (String element : list) {
if (!list2.contains(element)) {
list2.add(element);
}
}
System.out.println(list2);
}
這個是最基本的實作了,創建一個空的 List,添加前判斷一下存在不存在,不存在才添加,這樣就保證了元素不重復,
輸出結果:
[張三, 李四, 周一, 劉四, 李強, 李白, 王五]
2、for 雙回圈去重
/**
* for 雙回圈去重
* @author: 堆疊長
* @from: 公眾號Java技術堆疊
*/
@Test
public void remove2() {
List<String> list = new ArrayList(initList);
for (int i = 0; i < list.size() - 1; i++) {
for (int j = list.size() - 1; j > i; j--) {
if (list.get(j).equals(list.get(i))) {
list.remove(j);
}
}
}
System.out.println(list);
}
利用雙回圈,判斷是否有相等的,再進行移除,
輸出結果:
[張三, 李四, 周一, 劉四, 李強, 李白, 王五]
3、for 回圈重復坐標去重
/**
* for 回圈重復坐標去重
* @author: 堆疊長
* @from: 公眾號Java技術堆疊
*/
@Test
public void remove3() {
List<String> list = new ArrayList(initList);
List<String> list2 = new ArrayList(initList);
for (String element : list2) {
if (list.indexOf(element) != list.lastIndexOf(element)) {
list.remove(list.lastIndexOf(element));
}
}
System.out.println(list);
}
這種方式很新穎吧?
復制一個 list2,再回圈 List2,判斷 list 中的元素的首尾出現的坐標位置是否一致,如果一致,則說明沒有重復的,否則重復,再洗掉重復的位置的元素,
輸出結果:
[張三, 李四, 周一, 劉四, 李強, 李白, 王五]
4、Set 去重
/**
* Set 去重
* @author: 堆疊長
* @from: 公眾號Java技術堆疊
*/
@Test
public void remove4() {
List<String> list = new ArrayList(initList);
List<String> list2 = new ArrayList(new HashSet(list));
System.out.println(list2);
}
這招也太簡單了吧,一行代碼搞定!
我們知道 Set 是不包含重復元素的,把 List 先裝進 HashSet,然后再裝回來,這樣就保證了元素的不重復,
輸出結果:
[李強, 李四, 張三, 周一, 李白, 王五, 劉四]
結果雖然正確,但元素順序和原始 List 不一致,如果要保證順序性,可以把 HashSet 換成 LinkedHashSet:
/**
* Set 去重
* @author: 堆疊長
* @from: 公眾號Java技術堆疊
*/
@Test
public void remove4() {
List<String> list = new ArrayList(initList);
List<String> list2 = new ArrayList(new LinkedHashSet(list));
System.out.println(list2);
}
輸出結果:
[張三, 李四, 周一, 劉四, 李強, 李白, 王五]
這下順序對了吧,LinkedHashSet 可以保證元素的順序性!
5、Stream 去重
/**
* Stream 去重
* @author: 堆疊長
* @from: 公眾號Java技術堆疊
*/
@Test
public void remove5() {
List<String> list = new ArrayList(initList);
list = list.stream().distinct().collect(Collectors.toList());
System.out.println(list);
}
利用 Stream 的 distinct 方法去重,這個方法也十分簡單,一行代碼搞定!Stream 基礎就不介紹了,Stream 系列我之前寫過一個專題了,不懂的關注公眾號Java技術堆疊,然后在公眾號 Java 教程選單中閱讀,
輸出結果:
[張三, 李四, 周一, 劉四, 李強, 李白, 王五]
總結
本文總結了 5 種去除 List 重復元素的方法:
- for 回圈添加去重
- for 雙回圈去重
- for 回圈重復坐標去重
- Set 去重
- Stream 去重
最后兩種方案最簡單,都是一行代碼就能搞定的,推薦使用!
所以說,你身邊還有誰不會洗掉 List 中的元素?還有誰不會 List 去重的?把這篇文章發給他吧,讓大家少走彎路,少寫垃圾代碼,共同進步,
本文所有完整示例源代碼已經上傳:
https://github.com/javastacks/javastack
歡迎 Star 學習,后面 Java 示例都會在這上面提供!
你還知道哪些去重技巧?歡迎留言分享~
好了,今天的分享就到這里了,后面堆疊長會分享更多好玩的 Java 技術和最新的技術資訊,關注公眾號Java技術堆疊第一時間推送,我也將主流 Java 面試題和參考答案都整理好了,在公眾號后臺回復關鍵字 "面試" 進行刷題,
著作權宣告: 本文系公眾號 "Java技術堆疊" 原創,轉載、參考本文內容請注明出處,抄襲、洗稿一律投訴侵權,后果自負,并保留追究其法律責任的權利,
近期熱文推薦:
1.1,000+ 道 Java面試題及答案整理(2022最新版)
2.勁爆!Java 協程要來了,,,
3.Spring Boot 2.x 教程,太全了!
4.別再寫滿屏的爆爆爆炸類了,試試裝飾器模式,這才是優雅的方式!!
5.《Java開發手冊(嵩山版)》最新發布,速速下載!
覺得不錯,別忘了隨手點贊+轉發哦!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/544671.html
標籤:Java
上一篇:RabbitMQ中間件
