背景: 想要得到 统计所有人在房间情况,集合personOutList为所有外出人员统计,集合personAllList为所有房间人员统计,简而言之personOutList(优先级更高) 覆盖personAllList人员id相同的数据
实现方法:推荐 distinctByCompare2 写法更简洁
package com.wang;
import lombok.Builder;
import lombok.Data;
/**
* 人员实体
*
* @author wangyl
* @date 2020年12月15日
*/
@Builder
@Data
public class PersonEntity {
/**
* 用户id
*/
private String userId;
/**
* 用户名字
*/
private String userName;
/**
* 用户状态 -1 出去 1 进来
*/
private String userStatus;
/**
* 房间号码
*/
private String roomNumber;
}
package com.wang;
import java.util.*;
import java.util.stream.Collectors;
/**
* List中根据某个实体的属性去重
*
* @author wangyl
* @date 2020年12月15日
*/
public class ListDistinct {
public static void main(String[] args) {
// 构建实体对象 模拟从数据查到的数据 注意这里张三这个人外出状态有两个 一个是1 一个是-1 最后只是想要-1的数据
PersonEntity person1 = PersonEntity.builder().userId("1").userName("张三").userStatus("1").roomNumber("101").build();
PersonEntity person_1 = PersonEntity.builder().userId("1").userName("张三").userStatus("-1").roomNumber("101").build();
PersonEntity person2 = PersonEntity.builder().userId("2").userName("李四").userStatus("1").roomNumber("101").build();
PersonEntity person3 = PersonEntity.builder().userId("3").userName("王五").userStatus("1").roomNumber("102").build();
// personAllList添加实体 全部人员
List<PersonEntity> personAllList = new ArrayList<>();
personAllList.add(person1);
personAllList.add(person2);
personAllList.add(person3);
// personOutList添加实体 外出人员
List<PersonEntity> personOutList = new ArrayList<>();
personOutList.add(person_1);
// 声明返回实体
List<PersonEntity> personReturnList;
// 方法一
// personReturnList=compareByFor(personAllList,personOutList);
personOutList.addAll(personAllList);
// 方法二
personReturnList = distinctByCompare1(personOutList);
// 方法三【推荐】其实和方法二一样 但lambda版本更简洁
// personReturnList=distinctByCompare2(personOutList);
// 方法四
// personReturnList=distinctBySet(personOutList);
Map<String, List<PersonEntity>> map = personReturnList.stream().collect(Collectors.groupingBy(PersonEntity::getRoomNumber));
System.out.println(map.toString());
}
/**
* 循环写法
*
* @param personAllList 全部人员集合
* @param personOutList 外出人员集合
* @return 去重后集合
*/
public static <T extends PersonEntity> List<T> compareByFor(List<T> personAllList, List<T> personOutList) {
List<T> personReturnList = new ArrayList<>();
for (T personAll : personAllList) {
boolean flag = false;
for (PersonEntity personOut : personOutList) {
if (personOut.getUserId().equals(personAll.getUserId())) {
flag = true;
continue;
}
}
if (flag == false) {
personReturnList.add(personAll);
}
}
personReturnList.addAll(personOutList);
return personReturnList;
}
/**
* 重写compare 方法
*
* @param oldList 去重复前集合
* @return 去重后集合
*/
public static <T extends PersonEntity> List<T> distinctByCompare1(List<T> oldList) {
Set<T> set = new TreeSet<>(new Comparator<T>() {
@Override
public int compare(T o1, T o2) {
return o1.getUserId().compareTo(o2.getUserId());
}
});
set.addAll(oldList);
return new ArrayList<>(set);
}
/**
* 重写compare 方法
*
* @param oldList 去重复前集合
* @return 去重后集合
*/
public static <T extends PersonEntity> List<T> distinctByCompare2(List<T> oldList) {
Set<T> set = new TreeSet<>(Comparator.comparing(PersonEntity::getUserId));
set.addAll(oldList);
return new ArrayList<>(set);
}
/**
* 使用Set实现List<Student>中stuName字段去重 </br>
*
* @param oldList
* @return
*/
public static <T extends PersonEntity> List<T> distinctBySet(List<T> oldList) {
Set<String> set = new HashSet<>();
List<T> newList = new ArrayList<>();
for (T t : oldList) {
if (!set.contains(t.getUserId())) {
set.add(t.getUserId());
newList.add(t);
}
}
return newList;
}
}