Отбор уникальных Person по сочетанию имени и отчества

Сформируйте отдельный ключ из firstName и patronymicName и сохраните по одному Person для каждого ключа. Equals, сгенерированный @Data для 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). Склейка полей в строку без надёжного кодирования может дать коллизии.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее