Ваше последнее изменение добавило важную деталь к вашим требованиям:
Только значения со счетом> 0 должны иметь значение isDuplicate
! = null
, то есть либо его собственный идентификатор (первое обнаруженное вхождение) или первое найденное вхождение.
Это означает, что ведение карты первых совпадений для каждого найденного residence
включает в себя также возможные обновления этих объектов.
В следующем примере это делается классическим способом Java без каких-либо потоков или функций Java 8:
public static void main(String[] args) {
List<PersonDetails> personDetails = new ArrayList<>();
personDetails.add(new PersonDetails(1, "a", null));
personDetails.add(new PersonDetails(2, "b", null));
personDetails.add(new PersonDetails(3, "a", null));
personDetails.add(new PersonDetails(4, "a", null));
personDetails.add(new PersonDetails(5, "b", null));
personDetails.add(new PersonDetails(6, "c", null));
personDetails.add(new PersonDetails(7, "c", null));
personDetails.add(new PersonDetails(8, "d", null));
// data structure that holds the PersonDetails with the first occurrence of a residence
Map<String, PersonDetails> firstIdFoundPerResidence = new HashMap<>();
for (PersonDetails pd : personDetails) {
// check if the current PersonDetails was found before
if (firstIdFoundPerResidence.containsKey(pd.getResidence())) {
// if yes, take it
PersonDetails first = firstIdFoundPerResidence.get(pd.getResidence());
// mark it as duplicate of the first one found
pd.setIsDuplicate(String.valueOf(first.getId()));
// and mark the first one itself as a non-unique residence
// (by setting its own id, for whatever reason)
first.setIsDuplicate(String.valueOf(first.getId()));
} else {
// otherwise just add the PersonDetails as first occurrence
firstIdFoundPerResidence.put(pd.getResidence(), pd);
}
}
personDetails.forEach(System.out::println);
}
Результат (с подходящим методом toString()
в PersonDetails
) таков:
[1, a, 1]
[2, b, 2]
[3, a, 1]
[4, a, 1]
[5, b, 2]
[6, c, 6]
[7, c, 6]
[8, d, null]
, что почти соответствует желаемому результату, который вы опубликовали, и я подозреваю, что вы сделали опечатку для идентификатора 7: должно иметь значение isDuplicate = 6
вместо 7
, поскольку это второе появление "c"
но там установлен собственный идентификатор.