Mac*_*ack 0 java collections performance arraylist duplicates
我声明了一个PersonDetails具有以下三个属性的对象:
long id;
String residence;
Run Code Online (Sandbox Code Playgroud)
然后,我有一个全部填充ArrayList的PersonDetails对象:
List<PersonDetails> personDetailsList = new ArrayList<>();
Run Code Online (Sandbox Code Playgroud)
我需要遍历此列表,以PersonDetails通过匹配其residence属性来找出重复项。
Id | Residence
1 | a
2 | b
3 | a
4 | a
5 | b
6 | c
7 | c
8 | d
Run Code Online (Sandbox Code Playgroud)
我为完成此操作而创建的代码/算法如下,并使用nested 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++;
}
}
}
Run Code Online (Sandbox Code Playgroud)
谁能建议一种更省时的方式来解决这个问题?我正在尝试寻找一种更好的方法来优化此效果,但是非常感谢您第二眼。嵌套的for循环对于更大的数据集将是地狱。
您可以在PersonDetails列表上进行一次迭代来完成此操作,并记住residence第一次遇到时使用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
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
84 次 |
| 最近记录: |