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 通過(guò)HashSet去重
/**
* 通過(guò)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或者長(zhǎng)度也在發(fā)生變化,這樣會(huì)造成少刪除,也可用Stream流進(jìn)行過(guò)濾刪除
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ù)年級(jí)和專(zhuān)業(yè),當(dāng)年級(jí)和專(zhuān)業(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));
通過(guò)hashSet去重(如將classNames去重):該種去重是bean完全相同的時(shí)候算重復(fù)數(shù)據(jù)
List<String> classNameList = new ArrayList(new HashSet(classNames));
7 刪除集合中多個(gè)元素
因?yàn)閟tream遍歷的底層還是迭代器所以就不能邊遍歷邊刪除會(huì)出現(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)文章
特殊數(shù)據(jù)結(jié)構(gòu)之使用Java實(shí)現(xiàn)單調(diào)棧示例
這篇文章主要為大家介紹了特殊數(shù)據(jù)結(jié)構(gòu)之使用Java實(shí)現(xiàn)單調(diào)棧示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09
Jmeter內(nèi)置變量vars和props的使用詳解
JMeter是一個(gè)功能強(qiáng)大的負(fù)載測(cè)試工具,它提供了許多有用的內(nèi)置變量來(lái)支持測(cè)試過(guò)程,其中最常用的變量是 vars 和 props,本文通過(guò)代碼示例詳細(xì)給大家介紹了Jmeter內(nèi)置變量vars和props的使用,需要的朋友可以參考下2024-08-08
Java類(lèi)加載之Class對(duì)象到Klass模型詳解
這篇文章主要介紹了Java類(lèi)加載之Class對(duì)象到Klass模型詳解,每一個(gè)Java類(lèi)在JVM中都會(huì)對(duì)應(yīng)創(chuàng)建一個(gè)C++類(lèi)實(shí)例,我們稱(chēng)這個(gè)C++類(lèi)為Klass實(shí)例,Klass實(shí)例里面存儲(chǔ)了java類(lèi)中所描述的方法、字段、屬性等,需要的朋友可以參考下2023-08-08
基于java中的null類(lèi)型---有關(guān)null的9件事
這篇文章主要介紹了java中的null類(lèi)型---有關(guān)null的9件事,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08
關(guān)于maven工程多模塊、項(xiàng)目打包問(wèn)題
這篇文章主要介紹了關(guān)于maven工程多模塊、項(xiàng)目打包問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-03-03
Spring事務(wù)管理中關(guān)于數(shù)據(jù)庫(kù)連接池詳解
事務(wù)的作用就是為了保證用戶(hù)的每一個(gè)操作都是可靠的,事務(wù)中的每一步操作都必須成功執(zhí)行,只要有發(fā)生異常就 回退到事務(wù)開(kāi)始未進(jìn)行操作的狀態(tài)。事務(wù)管理是Spring框架中最為常用的功能之一,我們?cè)谑褂肧pring Boot開(kāi)發(fā)應(yīng)用時(shí),大部分情況下也都需要使用事務(wù)2022-12-12
springcloud Zuul動(dòng)態(tài)路由的實(shí)現(xiàn)
這篇文章主要介紹了springcloud Zuul動(dòng)態(tài)路由的實(shí)現(xiàn),詳細(xì)的介紹了什么是Zuu及其動(dòng)態(tài)路由的實(shí)現(xiàn),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-11-11
JPA-JpaRepository方法命名語(yǔ)法說(shuō)明
這篇文章主要介紹了JPA-JpaRepository方法命名語(yǔ)法說(shuō)明,具有很好的參考價(jià)值。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11
Spring中的FactoryBean與ObjectFactory詳解
這篇文章主要介紹了Spring中的FactoryBean與ObjectFactory詳解,FactoryBean是一種特殊的bean,本身又是個(gè)工廠,實(shí)現(xiàn)了FactoryBean的bean會(huì)被注冊(cè)到容器中,需要的朋友可以參考下2023-12-12
SpringCloud啟動(dòng)eureka server后,沒(méi)報(bào)錯(cuò)卻不能訪問(wèn)管理頁(yè)面(404問(wèn)題)
這篇文章主要介紹了SpringCloud啟動(dòng)eureka server后,沒(méi)報(bào)錯(cuò)卻不能訪問(wèn)管理頁(yè)面(404問(wèn)題),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11

