当前位置:网站首页>面试: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去吧!
边栏推荐
- Pagoda panel MySQL cannot be started
- Swift saves an array of class objects with userdefaults and nssecurecoding
- Flutter development: a way to solve the problem of blank space on the top of listview
- Advanced opencv:bgr pixel intensity map
- Swift tableview style (I) system basic
- Implementation of smart home project
- 硬核,你见过机器人玩“密室逃脱”吗?(附代码)
- Flutter development: use safearea
- [200 opencv routines] 219 Add digital watermark (blind watermark)
- 【系统设计】指标监控和告警系统
猜你喜欢
自动化规范检查软件如何发展而来?
RMS to EAP is simply implemented through mqtt
Application of data modeling based on wide table
How Windows bat script automatically executes sqlcipher command
90%的人都不懂的泛型,泛型的缺陷和应用场景
苹果 5G 芯片研发失败?想要摆脱高通为时过早
Kotlin compose and native nesting
Design and exploration of Baidu comment Center
Node-RED系列(二九):使用slider与chart节点来实现双折线时间序列图
基于单片机步进电机控制器设计(正转反转指示灯挡位)
随机推荐
Kotlin compose and native nesting
Baidu app's continuous integration practice based on pipeline as code
Cerebral Cortex:有向脑连接识别帕金森病中广泛存在的功能网络异常
[tips] get the x-axis and y-axis values of cdfplot function in MATLAB
Android SQLite database encryption
Design of stepping motor controller based on single chip microcomputer (forward rotation and reverse rotation indicator gear)
Meitu lost 300 million yuan in currency speculation for half a year. Huawei was exposed to expand its enrollment in Russia. Alphago's peers have made another breakthrough in chess. Today, more big new
Fluent development: setting method of left and right alignment of child controls in row
Unity particle special effects series - the poison spray preform is ready, and the unitypackage package can be used directly - next
Apache dolphin scheduler system architecture design
QT realizes signal transmission and reception between two windows
Windows uses commands to run kotlin
How Windows bat script automatically executes sqlcipher command
oracle 多行数据合并成一行数据
如何獲取GC(垃圾回收器)的STW(暫停)時間?
Single chip microcomputer principle and Interface Technology (esp8266/esp32) machine human draft
90%的人都不懂的泛型,泛型的缺陷和应用场景
B站大量虚拟主播被集体强制退款:收入蒸发,还倒欠B站;乔布斯被追授美国总统自由勋章;Grafana 9 发布|极客头条...
Apache DolphinScheduler 系统架构设计
(1) Complete the new construction of station in Niagara vykon N4 supervisor 4.8 software