我声明了一个具有以下三个属性的对象PersonDetails

long id;
String residence;


然后,我有一个ArrayListPersonDetails个对象,它们都已填充:

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时第一次遇到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
  }
}

07-24 13:50