当前位置:网站首页>面试:List 如何根据对象的属性去重?
面试:List 如何根据对象的属性去重?
2022-07-05 09:41:00 【沙漠一只雕得儿得儿】
一、去除List中重复的String
public List<String> removeStringListDupli(List<String> stringList) {
Set<String> set = new LinkedHashSet<>();
set.addAll(stringList);
stringList.clear();
stringList.addAll(set);
return stringList;
}
或使用Java8的写法:
List<String> unique = list.stream().distinct().collect(Collectors.toList());
二、List中对象去重
比如现在有一个 Person类:
public class Person {
private Long id;
private String name;
public Person(Long id, String name) {
this.id = id;
this.name = name;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Person{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
重写Person对象的equals()
方法和hashCode()
方法:
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
if (!id.equals(person.id)) return false;
return name.equals(person.name);
}
@Override
public int hashCode() {
int result = id.hashCode();
result = 31 * result + name.hashCode();
return result;
}
下面对象去重的代码:
Person p1 = new Person(1l, "jack");
Person p2 = new Person(3l, "jack chou");
Person p3 = new Person(2l, "tom");
Person p4 = new Person(4l, "hanson");
Person p5 = new Person(5l, "胶布虫");
List<Person> persons = Arrays.asList(p1, p2, p3, p4, p5, p5, p1, p2, p2);
List<Person> personList = new ArrayList<>();
// 去重
persons.stream().forEach(
p -> {
if (!personList.contains(p)) {
personList.add(p);
}
}
);
System.out.println(personList);
List 的contains()
方法底层实现使用对象的equals方法去比较的,其实重写equals()
就好,但重写了equals最好将hashCode也重写了。
我们创建了一个高质量的技术交流群,与优秀的人在一起,自己也会优秀起来,赶紧点击加群,享受一起成长的快乐。
可以参见:
http://stackoverflow.com/questions/30745048/how-to-remove-duplicate-objects-from-java-arraylist
http://blog.csdn.net/growing_tree/article/details/46622579
三、根据对象的属性去重
下面要根据Person对象的id去重,那该怎么做呢?
写一个方法吧:
public static List<Person> removeDupliById(List<Person> persons) {
Set<Person> personSet = new TreeSet<>((o1, o2) -> o1.getId().compareTo(o2.getId()));
personSet.addAll(persons);
return new ArrayList<>(personSet);
}
通过Comparator比较器,比较对象属性,相同就返回0,达到过滤的目的。
再来看比较炫酷的Java8写法:
import static java.util.Comparator.comparingLong;
import static java.util.stream.Collectors.collectingAndThen;
import static java.util.stream.Collectors.toCollection;
// 根据id去重
List<Person> unique = persons.stream().collect(
collectingAndThen(
toCollection(() -> new TreeSet<>(comparingLong(Person::getId))), ArrayList::new)
);
这段炫酷的代码是google的,还不明白是怎么个原理,等我好好研究一下,再专门写篇文章好好阐述一下。
还有一种写法:
public static <T> Predicate<T> distinctByKey(Function<? super T, Object> keyExtractor) {
Map<Object, Boolean> map = new ConcurrentHashMap<>();
return t -> map.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;
}
// remove duplicate
persons.stream().filter(distinctByKey(p -> p.getId())).forEach(p -> System.out.println(p));
java8 确实简化了很多冗长的操作,精简了代码,小伙,研究java8去吧!
边栏推荐
- Android SQLite database encryption
- QT event filter simple case
- Is it really reliable for AI to make complex decisions for enterprises? Participate in the live broadcast, Dr. Stanford to share his choice | qubit · viewpoint
- Swift set pickerview to white on black background
- Comparison of batch merge between Oracle and MySQL
- TDengine 离线升级流程
- 搞数据库是不是越老越吃香?
- ThreadLocal source code learning
- MySQL数字类型学习笔记
- 【小技巧】获取matlab中cdfplot函数的x轴,y轴的数值
猜你喜欢
Advanced opencv:bgr pixel intensity map
.Net之延迟队列
Windows uses commands to run kotlin
How to use sqlcipher tool to decrypt encrypted database under Windows system
Charm of code language
Mysql80 service does not start
Cerebral cortex: directed brain connection recognition widespread functional network abnormalities in Parkinson's disease
[NTIRE 2022]Residual Local Feature Network for Efficient Super-Resolution
QT event filter simple case
Apache DolphinScheduler 系统架构设计
随机推荐
如何获取GC(垃圾回收器)的STW(暂停)时间?
oracle 多行数据合并成一行数据
H. 265 introduction to coding principles
MySQL digital type learning notes
Theme. AppCompat. Light. Darkactionbar not found
历史上的今天:第一本电子书问世;磁条卡的发明者出生;掌上电脑先驱诞生...
【小技巧】獲取matlab中cdfplot函數的x軸,y軸的數值
Roll up, break through 35 year old anxiety, and animate the CPU to record the function call process
Kotlin compose multiple item scrolling
程序员如何活成自己喜欢的模样?
搞数据库是不是越老越吃香?
Using directive in angualr2 to realize that the picture size changes with the window size
[C language] the use of dynamic memory development "malloc"
Optimize database queries using the cursor object of SQLite
正式上架!TDengine 插件入驻 Grafana 官网
Roll up, break 35 - year - old Anxiety, animation Demonstration CPU recording Function call Process
How to get the STW (pause) time of GC (garbage collector)?
Wechat applet - simple diet recommendation (4)
Oracle combines multiple rows of data into one row of data
mysql80服务不启动