Сформируйте отдельный ключ из firstName и patronymicName и сохраните по одному Person для каждого ключа. Equals, сгенерированный @Data для Person, учитывает лишние поля и здесь не подходит.
Отбор уникальных Person по сочетанию имени и отчества
Сформируйте отдельный ключ из firstName и patronymicName и сохраните по одному Person для каждого ключа. Equals, сгенерированный @Data для Person, учитывает лишние поля и здесь не подходит.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Необходимо реализовать функцию unique, получающую список объектов класса Person и возвращающую коллекцию, в которой присутствуют только уникальные записи. Уникальность определяется парой полей firstName (имя) и patronymicName (отчество); значения id и secondName при этом игнорируются.
Требования:
- Если в исходном списке несколько объектов с одинаковыми firstName и patronymicName, оставить лишь один произвольный экземпляр.
- Порядок элементов в результирующей коллекции не обязателен.
- Для проверки уникальности следует сравнивать только комбинацию firstName и patronymicName.
@Data
@AllArgsConstructor
public static class Person {
public Integer id;
public String firstName;
public String secondName;
public String patronymicName;
}
@Test
public void test() {
List<Person> person = new ArrayList<>();
person.add(new Person(1, "Ivan", "Vasya", "Petr"));
person.add(new Person(2, "Ivan", "Vasya", "Petr"));
person.add(new Person(3, "Ivan", "Vasya", "Petr"));
person.add(new Person(4, "Ivan", "Gupta", "Ivan"));
person.add(new Person(5, "Petr", "Rama", "Igor"));
Collection<Person> uniquePerson = unique(person);
assert uniquePerson.size() == 3;
}
public static Collection<Person> unique(List<Person> persons){
}
Ответ
Сформируйте отдельный ключ из firstName и patronymicName и сохраните по одному Person для каждого ключа. Equals, сгенерированный @Data для Person, учитывает лишние поля и здесь не подходит.
record NameKey(String firstName, String patronymicName) {}
public static Collection<Person> unique(List<Person> persons) {
Map<NameKey, Person> byName = new HashMap<>();
for (Person person : persons) {
NameKey key = new NameKey(person.firstName, person.patronymicName);
byName.putIfAbsent(key, person);
}
return new ArrayList<>(byName.values());
}
Вариант для Java с поддержкой record сохраняет первый экземпляр; порядок результата не гарантируется. Null в полях ключа поддерживается, null вместо Person — нет. Время в среднем O(n), память O(k). Склейка полей в строку без надёжного кодирования может дать коллизии.