Невозможно использовать TreeSet's метод has()

У меня есть TreeSet, где элементы являются объектами с двумя атрибутами (имя и возраст). Каждый раз, когда я хочу найти объект с определенным именем, мне приходится прибегать к расширенному циклу for или итератору.

Я не могу использовать contains() метод для поиска объекта с определенным именем, потому что имя "инкапсулировано" внутри этого объекта.

Есть ли способ преодолеть эту проблему? То есть способ воспользоваться log(n) временная сложность contains()?

Поскольку все элементы в TreeSet отсортированы по имени, я думаю, должен быть способ.

Пример того, чего я хочу достичь:

public Element search(String name) {
    // if some TreeSet element's name.equals(name), return the Element
}

Пример того, что я не хочу использовать:

public Element search(String name) {
    for (Element entry : tree) {
        if (entry.getName().equals(name)) {
            return entry;
        }
    }

    return null;
}

2 ответа

TreeSet упорядочивает элементы на основе его Comparator,

Вы можете реализовать операцию сравнения для сортировки по имени.

В общем, наши существующие TreeSet<Person> не может быть использован для поиска по имени. Набор деревьев будет организован на основе того, какой порядок вы определили для набора.

В общем, вам нужен отдельный Map<String, Person> который содержит сопоставления для всех Person объекты в оригинальном наборе. Это влечет за собой сохранение набора и карты в шаге.

Однако, если упорядочение вашего древовидного набора было сочетанием имени и возраста, а имя было основным, то вы могли бы использовать TreeSet.tailSet чтобы получить "хвост" множества, начинающегося с заданного имени. Затем повторяйте набор хвостов, пока имя не изменится.

Другие вопросы по тегам