Java List對象集合中 如何根據(jù)集合中對象某幾個屬性組合去重
Java List對象集合中 如何根據(jù)集合中對象某幾個屬性組合去重
在Java中,如果你想要根據(jù)一個List中的對象的幾個屬性進行去重,可以使用以下幾種方法:
方法一:使用 Set 和自定義的 equals() 和 hashCode()
你可以創(chuàng)建一個自定義類,并為這個類實現(xiàn)equals()和hashCode()方法。然后使用HashSet來存儲這些對象,因為HashSet不允許重復元素。
class MyClass {
private String attr1;
private String attr2;
// 構造函數(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,可以簡化代碼。通過收集器Collectors.toCollection()與LinkedHashSet保證插入順序。
List<MyClass> distinctList = list.stream()
.collect(Collectors.toCollection(LinkedHashSet::new))
.stream()
.collect(Collectors.toList());```如果需要根據(jù)特定屬性去重,可以使用distinct()結合Comparator或更復雜的邏輯。
方法三:使用 Collectors.groupingBy 和 findFirst
這種方法可以確保只保留每個組的第一個元素:
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對象本身。請注意這種方法可能不會保持元素的原始順序。
擴展:java list集合三種去重方法
java list集合三種去重方法
public class ListDistinct <T>{
/**
* 通過set去重, 不打亂原有l(wèi)ist的順序
* list中相同的對象會被去重復
*
* @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;
}
/**
* 通過set去重, 順序可能會亂
* list中相同的對象會被去重復
*
* @param List<T> list
* @return List<T>
* */
public List<T> distinctBySet(List<T> list){
return new ArrayList<T>(new HashSet<T>(list));
}
/**
* 通過遍歷判斷后將賦予新的集合
*
* @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());
}
}到此這篇關于Java List對象集合中 如何根據(jù)集合中對象某幾個屬性組合去重的文章就介紹到這了,更多相關java list集合對象去重內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
MyBatisPlus+SpringBoot實現(xiàn)樂觀鎖功能詳細流程
樂觀鎖是針對一些特定問題的解決方案,主要解決丟失更新問題,下面這篇文章主要給大家介紹了關于MyBatisPlus+SpringBoot實現(xiàn)樂觀鎖功能的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2023-03-03
SpringCloud手寫Ribbon實現(xiàn)負載均衡
這篇文章主要介紹了SpringCloud手寫Ribbon實現(xiàn)負載均衡的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-01-01
利用Java異常機制實現(xiàn)模擬借書系統(tǒng)
這篇文章主要給大家介紹了利用Java異常機制實現(xiàn)模擬借書系統(tǒng)的相關資料,文中先對java異常機制進行了簡單介紹,而后通過示例代碼介紹了java語言是如何實現(xiàn)一個控制臺版的模擬借書系統(tǒng),需要的朋友可以參考學習,一起來看看吧。2017-04-04
基于Java的Socket編寫的C/S聊天程序?qū)崿F(xiàn)
這篇文章主要介紹了基于Java的Socket編寫的C/S聊天程序?qū)崿F(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-03-03
java數(shù)組實現(xiàn)隊列及環(huán)形隊列實現(xiàn)過程解析
這篇文章主要介紹了java數(shù)組實現(xiàn)隊列及環(huán)形隊列實現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-10-10
Java如何使用遞歸查詢多級樹形結構數(shù)據(jù)(多級菜單)
這篇文章主要介紹了Java如何使用遞歸查詢多級樹形結構數(shù)據(jù)(多級菜單),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-07-07

