Поиск в коллекции по двум полям со сложностью O(log(n))

Всех приветствую, хотел бы узнать по поводу алгоритма со сложностью O(log(n)).

Есть класс, в нём атрибуты login, name, age, pass и т. д. Коллекция для них может быть любой, но желательно хотелось бы увидеть реализацию на TreeSet и т. д.

Как найти экземпляр класса в коллекции по атрибутам login и name? Коллекция может содержать от 5 000 до 50 000 объектов.


Ответы (1 шт):

Автор решения: Vadik

Cоздайте составной ключ PersonKey, в котором будут содержаться login и name. Будем использовать TreeMap, поэтому реализуйте интерфейс Comparable:

public class PersonKey implements Comparable<PersonKey> {

    private final String login;
    private final String name;

    ...

    @Override
    public int compareTo(PersonKey other) {
        return Comparator.comparing(PersonKey::getLogin)
                .thenComparing(PersonKey::getName)
                .compare(this, other);
    }
}

Теперь можно складывать объекты в TreeMap:

Map<PersonKey, Person> people = new TreeMap<>();
people.put(new PersonKey(login, name), new Person(login, name, age))

И доставать за O(log(n)):

people.get(new PersonKey(login, name));
→ Ссылка