Java List集合去重的多種實(shí)現(xiàn)方法
Java List集合去重的多種方法
1 循環(huán)list中的所有元素然后刪除重復(fù)
/** * 循環(huán)list中的所有元素然后刪除重復(fù) * @param list 待去重的list * @return 去重后的list */ public static <T> List<T> removeDuplicate(List<T> list){ 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); } } } return list; }
2 通過HashSet去重
/** * 通過HashSet去重 * @param list 待去重的list * @return 去重后的list */ public static <T> List<T> removeDuplicateHashSet(List<T> list){ HashSet<T> hs = new HashSet<>(list); list.clear(); list.addAll(hs); return list; }
3 刪除List中重復(fù)元素,并保持順序
/** * 刪除List中重復(fù)元素,并保持順序 * @param list 待去重的list * @return 去重后的list */ public static <T> List<T> removeDuplicateKeepOrder(List<T> list){ Set set = new HashSet(); List<T> newList = new ArrayList<>(); for (T element : list) { //set能添加進(jìn)去就代表不是重復(fù)的元素 if (set.add(element)) newList.add(element); } list.clear(); list.addAll(newList); return list; }
4 利用list.contain() 去重
/** * 利用list.contain() 去重 * @param list * @return */ public static <T> List<T> removeDuplicateContain(List<T> list){ List<T> listTemp = new ArrayList<>(); for (T aList : list) { if (!listTemp.contains(aList)) { listTemp.add(aList); } } return listTemp; }
5 注意事項(xiàng)
刪除的時(shí)候size或者長度也在發(fā)生變化,這樣會造成少刪除,也可用Stream流進(jìn)行過濾刪除
List filterList = list.stream().filter(user -> user.getAge() >= 40) .collect(toList());
例子:
JSONObject jsonObject = JSONObject.parseObject(forEntity.getBody()); String content = jsonObject.getString("content"); JSONArray jsonArray = JSONObject.parseArray(content); for (int i = jsonArray.size() - 1; i >= 0; i--) { JSONObject jsonObject1 = jsonArray.getJSONObject(i); String caseId = jsonObject1.getString("caseId"); QueryWrapper queryWrapper=new QueryWrapper(); queryWrapper.eq("user_id",caseInfoQueryParam.getUserId()); queryWrapper.eq("case_id",caseId); queryWrapper.last("limit 1"); CaseInfo caseInfo = caseInfoMapper.selectOne(queryWrapper); logger.info("案件綁定詳情去重的案件->{}",caseInfo); if (caseInfo!=null){ jsonArray.remove(i); } }
6 利用stream分組及去重
分組
classEntities.stream().collect(Collectors.groupingBy(ClassEntity::getGrade));
java8去重(根據(jù)年級和專業(yè),當(dāng)年級和專業(yè)都相同的情況下看做是重復(fù)數(shù)據(jù))
List<ClassEntity> distinctClass = classEntities.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(o -> o.getProfessionId() + ";" + o.getGrade()))), ArrayList::new));
通過hashSet去重(如將classNames去重):該種去重是bean完全相同的時(shí)候算重復(fù)數(shù)據(jù)
List<String> classNameList = new ArrayList(new HashSet(classNames));
7 刪除集合中多個(gè)元素
因?yàn)閟tream遍歷的底層還是迭代器所以就不能邊遍歷邊刪除會出現(xiàn)異常ConcurrentModificationException
,所以用傳統(tǒng)for循環(huán)刪除,一種刪除是倒著刪,另一種就是刪除后重新倒退一位標(biāo)志位
public static void main(String[] args) { ArrayList<String> arrayList = new ArrayList(); arrayList.add("111"); arrayList.add("222"); // arrayList.stream().forEach(s -> { // arrayList.remove(s); // System.out.println(arrayList.size()); // } // ); for (int i = 0; i < arrayList.size(); i++) { arrayList.remove(i); i--; } System.out.println(arrayList); }
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
詳解在Spring3中使用注解(@Scheduled)創(chuàng)建計(jì)劃任務(wù)
本篇文章主要介紹了詳解在Spring3中使用注解(@Scheduled)創(chuàng)建計(jì)劃任務(wù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-03-03深入了解Spring中g(shù)etBean()的五種方式
在本文中,我們將詳細(xì)介紹從BeanFactory中獲取bean的多種方式。簡單地說,正如方法的名稱所表達(dá)的,getBean()負(fù)責(zé)從Spring?IOC容器中獲取bean實(shí)例,希望對大家有所幫助2023-02-02SpringMVC @RequestBody 為null問題的排查及解決
這篇文章主要介紹了SpringMVC @RequestBody 為null問題的排查及解決,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10@PathParam和@QueryParam區(qū)別簡析
這篇文章主要介紹了@PathParam和@QueryParam區(qū)別,分享了相關(guān)實(shí)例代碼,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01Intellij IDEA創(chuàng)建spring-boot項(xiàng)目的圖文教程
本文通過圖文并茂的形式給大家介紹了Intellij IDEA創(chuàng)建spring-boot項(xiàng)目的教程,本文給大家介紹的非常詳細(xì),具有參考借鑒價(jià)值,需要的朋友參考下吧2018-01-01MyBatis動態(tài)SQL標(biāo)簽的用法詳解
這篇文章主要介紹了MyBatis動態(tài)SQL標(biāo)簽的用法詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04Java中JWT令牌實(shí)現(xiàn)登錄驗(yàn)證
本文主要介紹了JWT令牌在Java中實(shí)現(xiàn)登錄驗(yàn)證的方法,JWT是一種自我包含的、無狀態(tài)的認(rèn)證機(jī)制,可以用來在客戶端和服務(wù)器之間傳遞安全可靠的信息,感興趣的可以了解一下2024-12-12關(guān)于Spring事務(wù)隔離、傳播屬性與@Transactional注解
這篇文章主要介紹了關(guān)于事務(wù)隔離、Spring傳播屬性與@Transactional注解,如果一組處理步驟或者全部發(fā)生或者一步也不執(zhí)行,我們稱該組處理步驟為一個(gè)事務(wù),需要的朋友可以參考下2023-05-05