JAVA中List集合按照对象的某些字段去重实现
方式一使用双重循环实现
案例:
import org.apache.commons.lang3.StringUtils;
import java.util.*;
/**
* @Auther:
* @Date: 2019/1/11 09:11
* @Description: 根据list中对象指定的n个字段去重测试
*/
public class TestMyUser {
@org.junit.Test
public void test(){
List<MyUser> list1 = new ArrayList<>();
List<MyUser> list2 = new ArrayList<>();
MyUser user1 = new MyUser();
user1.setUserName("zhangsan");
user1.setPassWord("123456");
list1.add(user1);
MyUser user2 = new MyUser();
user2.setUserName("zhangsan");
user2.setPassWord("123456");
list1.add(user2);
MyUser user3 = new MyUser();
user3.setUserName("lisi");
user3.setPassWord("123456");
list1.add(user3);
MyUser user4 = new MyUser();
user4.setUserName("lisi");
user4.setPassWord("123456");
list1.add(user4);
list1.stream().forEach(item->{
list1.strean().forEach(item2->{
if(item1.equals(item2)){
continue;
}
if(Integer.valueof(item1.getPassWord)>Integer.valueof(item2.getPassWord)){
list2.add(item2);
}
})
})
list1.removeAll(list2);
list1.strean().forEach(System.out::plintln)
}
}
方式二使用比较器实现
案例:
import org.apache.commons.lang3.StringUtils;
import java.util.*;
/**
* @Auther:
* @Date: 2019/1/11 09:11
* @Description: 根据list中对象指定的n个字段去重测试
*/
public class TestMyUser {
@org.junit.Test
public void test(){
List<MyUser> list1 = new ArrayList<>();
MyUser user1 = new MyUser();
user1.setUserName("zhangsan");
user1.setPassWord("123456");
list1.add(user1);
MyUser user2 = new MyUser();
user2.setUserName("zhangsan");
user2.setPassWord("123456");
list1.add(user2);
MyUser user3 = new MyUser();
user3.setUserName("lisi");
user3.setPassWord("123456");
list1.add(user3);
MyUser user4 = new MyUser();
user4.setUserName("lisi");
user4.setPassWord("123456");
list1.add(user4);
for (MyUser b: list1) {
System.out.println("去重前:"+b.toString());
}
//去重
list1 = removeDuplicateOutputField(list1);
for (MyUser b: list1) {
System.out.println("去重后:"+b.toString());
}
}
/**
* 根据list中对象某些字段去重
* @param list 需要去重的list
* @return 返回去重后的list
*/
public static List<MyUser> removeDuplicates(List<MyUser> entityList) {
Set<String> uniqueKeys = new HashSet<>();
List<MyUser> uniqueEntities = new ArrayList<>();
for (MyUser entity : entityList) {
String key = entity.getFecthType() + "_" +
entity.getConfNum() + "_" +
entity.getConfNameParent() + "_" +
entity.getConfDateStartYear();
if (!uniqueKeys.contains(key)) {
uniqueKeys.add(key);
uniqueEntities.add(entity);
}
}
return uniqueEntities;
}
}
提示:多个列表的不同属性实现去重时,可以定义个ertity实体,整合在一个列表后再去重
方式三
生成唯一key的方式
public static List<EmConfUnionInfoEntity> removeDuplicates(List<EmConfUnionInfoEntity> entityList) {
Set<String> uniqueKeys = new HashSet<>();
List<EmConfUnionInfoEntity> uniqueEntities = new ArrayList<>();
for (EmConfUnionInfoEntity entity : entityList) {
String key = entity.getFecthType() + "_" +
entity.getConfNum() + "_" +
entity.getConfNameParent() + "_" +
entity.getConfDateStartYear();
if (!uniqueKeys.contains(key)) {
uniqueKeys.add(key);
uniqueEntities.add(entity);
}
}
return uniqueEntities;
}
方式四
新增类,类只有需要去重的属性,重写该类的hashCode()或equals()来实现去重
为了实现按照fecthType、confNum、confNameParent和confDateStartYear属性值进行去重,您可以按照以下步骤进行操作:
创建一个自定义的类,用于存储上述属性值。
java
class ConferenceInfo {
private String fecthType;
private String confNum;
private String confNameParent;
private String confDateStartYear;
// 添加构造函数、getter和setter方法
// 重写equals()和hashCode()方法(用于去重)
}
将给定的内容转换为EmConfUnionInfoEntity对象列表,并提取所需属性值创建ConferenceInfo对象。
List<EmConfUnionInfoEntity> entityList = ... // 将内容转换为EmConfUnionInfoEntity对象列表
List<ConferenceInfo> conferenceInfoList = new ArrayList<>();
for (EmConfUnionInfoEntity entity : entityList) {
ConferenceInfo conferenceInfo = new ConferenceInfo();
conferenceInfo.setFecthType(entity.getFecthType());
conferenceInfo.setConfNum(entity.getConfNum());
conferenceInfo.setConfNameParent(entity.getConfNameParent());
conferenceInfo.setConfDateStartYear(entity.getConfDateStartYear());
conferenceInfoList.add(conferenceInfo);
}
使用HashSet进行去重操作,HashSet会自动根据重写的equals()和hashCode()方法进行去重。
Set<ConferenceInfo> uniqueConferenceInfoSet = new HashSet<>(conferenceInfoList);
现在,uniqueConferenceInfoSet中将只包含按照fecthType、confNum、confNameParent和confDateStartYear属性值进行去重后的对象。您可以将其转换回列表或进行其他操作,根据您的需求进行处理。