java集合List快速實(shí)現(xiàn)重復(fù)判斷的方法小結(jié)
在java編寫代碼中經(jīng)常會(huì)遇到某些重復(fù)判定或者去重的操作,包括:
- 數(shù)據(jù)清洗:從數(shù)據(jù)庫或其他來源獲取的數(shù)據(jù)可能包含重復(fù)項(xiàng),需要去重。
- 用戶輸入:前段傳入的數(shù)據(jù)可能存在重復(fù),需要校驗(yàn)去除重來避免處理時(shí)出現(xiàn)錯(cuò)誤或不一致。
- 列表合并:將多個(gè)列表合并后,可能會(huì)產(chǎn)生重復(fù)元素,去重也是合并后常見的操作。
以下是用來記錄會(huì)用到的去重操作,以防忘記:
1、使用流式 API
使用流式 API,通過流式 API 優(yōu)雅地檢查重復(fù)數(shù)據(jù)(推薦)
import java.util.Arrays; import java.util.List; import java.util.Set; import java.util.stream.Collectors; public class CheckDuplicate { public static void main(String[] args) { List<String> list = Arrays.asList("A", "B", "C", "A"); // 找到重復(fù)元素 Set<String> duplicates = list.stream() .filter(item -> list.stream().filter(item::equals).count() > 1) .collect(Collectors.toSet()); System.out.println("重復(fù)元素: " + duplicates); System.out.println("是否存在重復(fù)數(shù)據(jù): " + !duplicates.isEmpty()); } }
stream
是一種功能非常強(qiáng)大的方式,可以很便利的使用聲明式方法對(duì)集合進(jìn)行處理,不需要顯式地操作集合中的元素。它提供了一個(gè)更加函數(shù)式的編程模型,允許你進(jìn)行過濾、轉(zhuǎn)換、收集等操作,同時(shí)鏈?zhǔn)秸{(diào)用,提高了代碼的可讀性和簡(jiǎn)潔性。
相比下forEach
是集合類的一個(gè)方法,用于對(duì)集合中的每個(gè)元素執(zhí)行一個(gè)操作,通常是遍歷操作。并不提供流式的轉(zhuǎn)換或過濾功能,更多是為了逐個(gè)訪問元素并執(zhí)行某些操作。forEach
的典型用法是遍歷集合,但不適合用于流式的處理,在這里 forEach
需要顯式地在內(nèi)部寫邏輯來計(jì)算元素的出現(xiàn)情況。
2、使用原生 Set 快速檢查
使用原生 Set 快速檢查,可以直接使用 HashSet 或 LinkedHashSet 來判斷
import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Set; public class CheckDuplicate { public static void main(String[] args) { List<String> list = Arrays.asList("A", "B", "C", "A"); Set<String> seen = new HashSet<>(); boolean hasDuplicate = list.stream().anyMatch(item -> !seen.add(item)); System.out.println("是否存在重復(fù)數(shù)據(jù): " + hasDuplicate); } }
!seen.add(item)
會(huì)返回:
true
--重復(fù)元素,false
--非重復(fù)元素,第一次添加
anyMatch
會(huì)匹配所有的流元素,一旦出現(xiàn)符合條件的重復(fù)元素就會(huì)自動(dòng)結(jié)束流,僅適合判斷是否會(huì)有重復(fù)元素。
3、使用new HashSet<>(list)
使用new HashSet<>(list),最后判斷兩個(gè)list間size大小判斷是否重復(fù)
import cn.hutool.core.collection.CollUtil; import java.util.Arrays; import java.util.List; import java.util.Set; public class CheckDuplicate { public static void main(String[] args) { List<String> list = Arrays.asList("A", "B", "C", "A"); // 使用 Hutool 的工具方法創(chuàng)建 HashSet Set<String> set = new HashSet<>(list); boolean hasDuplicate = set.size() != list.size(); System.out.println("是否存在重復(fù)數(shù)據(jù): " + hasDuplicate); } }
比較兩個(gè)集合size大小就可判斷是否存在重復(fù)元素,因?yàn)镾et下的集合是自動(dòng)去重的,如果存在重復(fù)則集合大小會(huì)縮減
4、使用CollUtil.countMap()方法
如果有hutool工具,可以使用CollUtil.countMap()方法
import cn.hutool.core.collection.CollUtil; import java.util.Arrays; import java.util.List; import java.util.Map; public class CheckDuplicate { public static void main(String[] args) { List<String> list = Arrays.asList("A", "B", "C", "A", "B"); // 統(tǒng)計(jì)每個(gè)元素出現(xiàn)的次數(shù) Map<String, Integer> countMap = CollUtil.countMap(list); // 打印重復(fù)元素 countMap.forEach((key, value) -> { if (value > 1) { System.out.println("重復(fù)元素: " + key + ",出現(xiàn)次數(shù): " + value); } }); } }
Collutil.countMap()方法不僅可以統(tǒng)計(jì)出現(xiàn)的重復(fù)的元素,還可以統(tǒng)計(jì)出現(xiàn)的頻次,返回結(jié)果如下:
重復(fù)元素: A,出現(xiàn)次數(shù): 2
重復(fù)元素: B,出現(xiàn)次數(shù): 2
相應(yīng)的還有CollUtil.newHashSet()
去重,CollUtil.getSet()
轉(zhuǎn)換Set<>集合去重,以及CollUtil.getCommon()
集合交差去重,方法很多有興趣的伙伴們可以去研究研究。
結(jié)語
總得來說java下stream流是非常不錯(cuò)的方式,而且其下有很多filter
,iterator
,filter()
, map()
, collect()
等操作,便于處理復(fù)雜邏輯鏈路問題
當(dāng)然,如果僅有一些簡(jiǎn)單內(nèi)部處理,直接foreach是最簡(jiǎn)單高效的方式,避免了流的轉(zhuǎn)換。
到此這篇關(guān)于java集合List快速實(shí)現(xiàn)重復(fù)判斷的方法小結(jié)的文章就介紹到這了,更多相關(guān)java重復(fù)判斷內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java?hutool?List集合對(duì)象拷貝示例代碼
- java的list集合排序自定義元素方式
- Java中hutool?List集合對(duì)象拷貝案例代碼
- Java將不同的List集合復(fù)制到另一個(gè)集合常見的方法
- Java?List集合取交集的五種常見方式總結(jié)
- Java?List集合取交集的8種不同實(shí)現(xiàn)方式總結(jié)
- java取出list中某幾個(gè)屬性組成一個(gè)新集合的幾種方式
- Java實(shí)現(xiàn)List集合手動(dòng)分頁的方法
- java如何獲取兩個(gè)List集合之間的交集、差集、并集
- Java中Set集合轉(zhuǎn)為L(zhǎng)ist集合常見的兩種方式
- Java集合中的List超詳細(xì)講解
相關(guān)文章
Java?KeyGenerator.generateKey的19個(gè)方法代碼示例
在下文中一共展示了KeyGenerator.generateKey方法的19個(gè)代碼示例,這些例子默認(rèn)根據(jù)受歡迎程度排序2021-12-12mybatis中映射文件(mapper)中的使用規(guī)則
這篇文章主要介紹了mybatis中映射文件(mapper)中的使用規(guī)則,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11SpringMVC實(shí)現(xiàn)返回響應(yīng)的項(xiàng)目實(shí)踐
本文主要介紹了SpringMVC實(shí)現(xiàn)返回響應(yīng)的項(xiàng)目實(shí)踐,包含返回靜態(tài)頁面,返回?cái)?shù)據(jù),返回html片段等實(shí)例,具有一定的參考價(jià)值,感興趣的可以了解一下2024-02-02mybatis-plus自動(dòng)裝配時(shí)間失效的解決
本文主要介紹了mybatis-plus自動(dòng)裝配時(shí)間失效,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04windows下java環(huán)境變量的設(shè)置方法
在“系統(tǒng)變量”中,設(shè)置3項(xiàng)屬性,JAVA_HOME,PATH,CLASSPATH(大小寫無所謂),若已存在則點(diǎn)擊“編輯”,不存在則點(diǎn)擊“新建”2013-09-09OpenJDK源碼解析之System.out.println詳解
這篇文章主要介紹了OpenJDK源碼解析之System.out.println詳解,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有非常好的幫助,需要的朋友可以參考下2021-04-04elasticsearch構(gòu)造Client實(shí)現(xiàn)java客戶端調(diào)用接口示例分析
這篇文章主要為大家介紹了elasticsearch構(gòu)造Client實(shí)現(xiàn)java客戶端調(diào)用接口示例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-04-04