Невозможно использовать 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
чтобы получить "хвост" множества, начинающегося с заданного имени. Затем повторяйте набор хвостов, пока имя не изменится.