java - 如何让算法在 Java 中更有效地查找集合中的重复对象?
问题描述
我已经声明了一个PersonDetails
具有以下三个属性的对象:
long id;
String residence;
然后我有一个全部填充ArrayList
的PersonDetails
对象:
List<PersonDetails> personDetailsList = new ArrayList<>();
我需要遍历此列表以PersonDetails
通过匹配其residence
属性来找出重复项。
Id | Residence
1 | a
2 | b
3 | a
4 | a
5 | b
6 | c
7 | c
8 | d
我为完成此任务而创建的代码/算法如下,并使用了一个嵌套的for loop
,这真的是低效的:
List<PersonDetails> personDetailsList = new ArrayList<>();
for (int i = 0; i <= personDetailsList.size() - 1; i++) {
long personId = personDetailsList.get(i)
.getId();
String personResidence = personDetailsList.get(i)
.getResidence();
for (int j = i + 1; j <= personDetailsList.size() - 1; j++) {
if (personResidence.equals(personDetailsList.get(j).getResidence())) {
count++;
}
}
}
任何人都可以提出一种更省时的方法来解决这个问题吗?我正在尝试想出一种更好的方法来优化这一点,但非常感谢第二双眼睛。对于更大的数据集,嵌套的 for 循环将是地狱。
解决方案
您可以对列表进行一次迭代PersonDetails
,记住您residence
第一次使用 a时遇到的情况Map<String, PersonDetails>
:
List<PersonDetails> personDetails = new ArrayList<>();
personDetails.add(new PersonDetails(1, "a"));
personDetails.add(new PersonDetails(2, "b"));
personDetails.add(new PersonDetails(3, "a"));
personDetails.add(new PersonDetails(4, "a"));
Map<String, PersonDetails> encountered = new HashMap<>();
for (PersonDetails pd : personDetails) {
PersonDetails first = encountered.putIfAbsent(pd.residence, pd);
if (first != null) {
pd.isDuplicate = first.id;
first.isDuplicate = first.id; // mark the first encountered as duplicate
}
}
推荐阅读
- python - 使用 Python-xmlrpc 从外部图像链接设置 Wordpress 帖子缩略图
- python - 如何获得像布尔字段选项这样的对象?DJANGO
- node.js - https调用上的Angular 5奇怪行为
- php - 我无法在 php 中将 for 循环更改为 while 循环?
- python-3.x - 在 Python 中使用关键字提取 Twitter 数据
- python - python中旋转13密码错误
- python - 如果字符串以熊猫中的某些字符开头,则选择行
- sql - PostgreSQL 在 WHERE 中的动态条件
- android - Room 数据库中的 Not Null 约束失败
- javascript - 如何在表单中显示逗号分隔值