当前位置:网站首页>面试: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去吧!
边栏推荐
- Observation cloud and tdengine have reached in-depth cooperation to optimize the cloud experience of enterprises
- Pagoda panel MySQL cannot be started
- From "chemist" to developer, from Oracle to tdengine, two important choices in my life
- Mobile heterogeneous computing technology GPU OpenCL programming (Advanced)
- La voie de l'évolution du système intelligent d'inspection et d'ordonnancement des petites procédures de Baidu
- Windows uses commands to run kotlin
- Comment obtenir le temps STW du GC (collecteur d'ordures)?
- 正式上架!TDengine 插件入驻 Grafana 官网
- Cut off 20% of Imagenet data volume, and the performance of the model will not decline! Meta Stanford et al. Proposed a new method, using knowledge distillation to slim down the data set
- [200 opencv routines] 219 Add digital watermark (blind watermark)
猜你喜欢
View Slide
Wechat applet - simple diet recommendation (4)
Application of data modeling based on wide table
程序员如何活成自己喜欢的模样?
【系统设计】指标监控和告警系统
Roll up, break 35 - year - old Anxiety, animation Demonstration CPU recording Function call Process
Understand the window query function of tdengine in one article
Why don't you recommend using products like mongodb to replace time series databases?
MySQL character type learning notes
MySQL字符类型学习笔记
随机推荐
Pagoda panel MySQL cannot be started
从“化学家”到开发者,从甲骨文到TDengine,我人生的两次重要抉择
Wechat applet - simple diet recommendation (4)
Single chip microcomputer principle and Interface Technology (esp8266/esp32) machine human draft
苹果 5G 芯片研发失败?想要摆脱高通为时过早
Getting started with Apache dolphin scheduler (one article is enough)
【系统设计】指标监控和告警系统
历史上的今天:第一本电子书问世;磁条卡的发明者出生;掌上电脑先驱诞生...
The essence of persuasion is to remove obstacles
Flutter development: use safearea
Evolution of Baidu intelligent applet patrol scheduling scheme
Wechat applet - simple diet recommendation (2)
View Slide
Cerebral Cortex:有向脑连接识别帕金森病中广泛存在的功能网络异常
A high density 256 channel electrode cap for dry EEG
一种用于干式脑电图的高密度256通道电极帽
天龙八部TLBB系列 - 单体技能群伤
. Net delay queue
MySQL character type learning notes
Tdengine connector goes online Google Data Studio app store