基本业务


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属性值进行去重后的对象。您可以将其转换回列表或进行其他操作,根据您的需求进行处理。


文章作者: zrh
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 zrh !
  目录