Java List對(duì)象集合中 如何根據(jù)集合中對(duì)象某幾個(gè)屬性組合去重
Java List對(duì)象集合中 如何根據(jù)集合中對(duì)象某幾個(gè)屬性組合去重
在Java中,如果你想要根據(jù)一個(gè)List中的對(duì)象的幾個(gè)屬性進(jìn)行去重,可以使用以下幾種方法:
方法一:使用 Set 和自定義的 equals() 和 hashCode()
你可以創(chuàng)建一個(gè)自定義類,并為這個(gè)類實(shí)現(xiàn)equals()和hashCode()方法。然后使用HashSet來(lái)存儲(chǔ)這些對(duì)象,因?yàn)镠ashSet不允許重復(fù)元素。
class MyClass {
private String attr1;
private String attr2;
// 構(gòu)造函數(shù)
public MyClass(String attr1, String attr2) {
this.attr1 = attr1;
this.attr2 = attr2;
}
// getter 和 setter 省略...
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null || getClass() != obj.getClass())
return false;
MyClass other = (MyClass) obj;
return attr1.equals(other.attr1) && attr2.equals(other.attr2);
}
@Override
public int hashCode() {
return attr1.hashCode() ^ attr2.hashCode();
}
}
// 使用示例
List<MyClass> list = new ArrayList<>();
// 填充list...
Set<MyClass> set = new HashSet<>(list);
list.clear();
list.addAll(set); // 去重后的list方法二:使用 Java 8 及以上版本的 Stream API
利用Java 8的Stream API,可以簡(jiǎn)化代碼。通過(guò)收集器Collectors.toCollection()與LinkedHashSet保證插入順序。
List<MyClass> distinctList = list.stream()
.collect(Collectors.toCollection(LinkedHashSet::new))
.stream()
.collect(Collectors.toList());```如果需要根據(jù)特定屬性去重,可以使用distinct()結(jié)合Comparator或更復(fù)雜的邏輯。
方法三:使用 Collectors.groupingBy 和 findFirst
這種方法可以確保只保留每個(gè)組的第一個(gè)元素:
Map<String, MyClass> result = list.stream()
.collect(Collectors.toMap(
o -> o.getAttr1() + o.getAttr2(), // key generator
Function.identity(), // value mapper
(oldValue, newValue) -> oldValue // merge function
));
List<MyClass> distinctList = new ArrayList<>(result.values());這里,鍵是屬性組合的字符串表示形式,而值則是MyClass對(duì)象本身。請(qǐng)注意這種方法可能不會(huì)保持元素的原始順序。
擴(kuò)展:java list集合三種去重方法
java list集合三種去重方法
public class ListDistinct <T>{
/**
* 通過(guò)set去重, 不打亂原有l(wèi)ist的順序
* list中相同的對(duì)象會(huì)被去重復(fù)
*
* @param List<T> list
* @return List<T>
* */
public List<T> distinctBySetOrder(List<T> list){
Set<T> set = new HashSet<T>();
List<T> newList = new ArrayList<T>();
for (T t :list) {
if(set.add(t)){
newList.add(t);
}
}
return newList;
}
/**
* 通過(guò)set去重, 順序可能會(huì)亂
* list中相同的對(duì)象會(huì)被去重復(fù)
*
* @param List<T> list
* @return List<T>
* */
public List<T> distinctBySet(List<T> list){
return new ArrayList<T>(new HashSet<T>(list));
}
/**
* 通過(guò)遍歷判斷后將賦予新的集合
*
* @param List<T>
* @reutrn List<T>
* */
public List<T> distinctByANewList(List<T> list){
List<T> newList = new ArrayList<T>();
for(T t : list){
if(!newList.contains(t)){
newList.add(t);
}
}
return newList;
}
public static void main(String[] args){
ListDistinct<String> ld = new ListDistinct<String>();
List<String> list = new ArrayList<String>();
list.add("zhang");
list.add("zhang");
list.add("ss");
list.add("ss");
list.add("2s");
list.add("s3");
System.out.println("1:" + ld.distinctBySetOrder(list).toString());
System.out.println("2:" + ld.distinctBySet(list).toString());
System.out.println("3:" + ld.distinctByANewList(list).toString());
}
}到此這篇關(guān)于Java List對(duì)象集合中 如何根據(jù)集合中對(duì)象某幾個(gè)屬性組合去重的文章就介紹到這了,更多相關(guān)java list集合對(duì)象去重內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳談HashMap和ConcurrentHashMap的區(qū)別(HashMap的底層源碼)
下面小編就為大家?guī)?lái)一篇詳談HashMap和ConcurrentHashMap的區(qū)別(HashMap的底層源碼)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-08-08
springboot 如何修改默認(rèn)端口及application.properties常用配置
這篇文章主要介紹了springboot 如何修改默認(rèn)端口及application.properties常用配置操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08
使用Lombok導(dǎo)致打印的tostring中缺少父類的屬性問(wèn)題
使用Lombok時(shí),若發(fā)現(xiàn)@Data注解的@ToString不包含父類屬性,可通過(guò)添加@ToString(callSuper=true)解決,此方法確保在生成toString()時(shí)包括父類的屬性,有效解決只打印子類屬性的問(wèn)題,這種做法對(duì)于需要完整信息展示的場(chǎng)景尤為重要2024-11-11
java 注解實(shí)現(xiàn)一個(gè)可配置線程池的方法示例
這篇文章主要介紹了java 注解實(shí)現(xiàn)一個(gè)可配置線程池的方法示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-01-01
Eclipse設(shè)置svn忽略文件或文件夾(svn:ignore)的操作
這篇文章主要介紹了Eclipse設(shè)置svn忽略文件或文件夾(svn:ignore)的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-01-01
SpringBoot雪花算法主鍵ID傳到前端后精度丟失問(wèn)題的解決
本文主要介紹了SpringBoot雪花算法主鍵ID傳到前端后精度丟失問(wèn)題的解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08
解決IDEA Maven下載依賴時(shí)報(bào)錯(cuò)ERROR - #org.jetbrains.ide
這篇文章主要介紹了解決IDEA Maven下載依賴時(shí)報(bào)錯(cuò)ERROR - #org.jetbrains.idea.maven - Cannot reconnect.問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08

