Почему Java TreeSet не имеет метода get()?
Что делать, если я хочу получать и обновлять объекты, хранящиеся в TreeSet?
Причина, по которой я спрашиваю, заключается в том, что я хочу иметь возможность поддерживать некоторый разрыв данных, который будет хранить учеников.
Я хочу, чтобы он сортировался (по классам - это переменная экземпляра Student), и - его нужно сортировать даже после того, как я обновляю один (или более) класс (ы).
Итак, после краткого изучения коллекций Java, я решил пойти с TreeSet и установить компаратор, который сравнивает двух учеников по их классам.
проблема в том, что я только что узнал, что TreeSet не имеет метода get()!
Любая помощь и предложения будут очень благодарны.
Ответы
Ответ 1
Что вы ожидаете от метода get()
для Set
?
- Наборы не индексируются, поэтому
get(int index)
не имеет смысла. (Используйте List
, если вы хотите получить элементы по индексу).
-
get(Object obj)
также не имеет смысла, потому что у вас будет объект, который вы пытаетесь получить уже.
- Существует уже метод
contains()
, чтобы проверить, содержит ли объект Set
объект.
- Вы можете выполнить итерацию по
Set
, если хотите сделать что-то со всеми элементами в наборе.
Ответ 2
Вы можете извлечь элементы из дерева с помощью Iterator. Вы можете попробовать что-то вроде этого:
Iterator<Integer> it = treeSet.iterator();
Integer current = 0;
while(it.hasNext() ) {
current = it.next();
}
Надеюсь, что это поможет.
Ответ 3
У меня есть случай, когда я использую два TreeSets (потому что они быстрее в поиске). Одно из этих деревьев огромно, а объекты в деревьях разные, поэтому я создаю макет объекта (типа 2, второе дерево), который имеет поля, используемые для сортировки, используя данные из объекта из маленького дерева и проверяем, на втором есть аналог. Теперь мне нужно проверить значение из объекта, найденного во втором дереве, чтобы добавить значение в отчет.
Использование итератора вместо бинарного поиска для извлечения нужного мне объекта поражает цель использования двоичного дерева. Второе дерево - 5 ГБ плюс, поиск совпадений с данными в первом дереве (200 МБ). Мне нужна стратегия поиска, которая имеет смысл для этого огромного количества данных, поэтому я выбрал дерево двоичного поиска. Записи уникальны.
Ответ 4
Как правило, вы не захотите получить элемент в наборе, когда он уже есть. Вы можете удалить свой элемент из набора или узнать, принадлежит ли он к набору, вот и все. Знайте, что хотите, чтобы вы указали своих учеников по классам, поэтому индекс - это класс, а не сам объект. Карта - это решение.
Если бы я был вами, я бы использовал следующую структуру, которая извлекает всех студентов с помощью
(они также сортируются по классам):
private SortedMap<Integer,Set<Student>> _studentsByGrade = new TreeMap<Integer,Set<Student>>();
public void updateStudent(Student student, int oldGrade, int newGrade)
{
getOrCreateContainer(oldGrade).remove(student);
getOrCreateContainer(newGrade).add(student);
student.setGrade(newGrade);
}
public Set<Student> getOrCreateContainer(int grade)
{
Set<Student> set = _studentsByGrade.get(grade);
if(set==null)
{
set = new HashSet<Student>();
_studentsByGrade.put(grade, set);
}
return set;
}
Не забудьте перегрузить символы equals и hashcode в вашем классе Student, чтобы он работал правильно.
Вы также можете проверить библиотеку cqengine, если вы хотите быстро и быстро выполнять java-индексацию, но приведенное выше решение просто подходит для вашего использования.
Ответ 5
Вы можете выполнить итерацию дерева для извлечения его объектов.
Как насчет NavigableSet? существуют методы для навигации на короткие расстояния, поскольку
E ceiling(E e) E floor(E e)
E higher(E e) E lower(E e)
Ответ 6
TreeSet
сортируется при вставке. Если вы заказываете по классам учащихся и изменяете их после добавления, элементы больше не сортируются (в том же порядке, что и раньше).
TreeSet
также не использует equals()
, чтобы определить, добавлен ли элемент, но вместо этого использует компаратор (тот же порядок = тот же элемент). Поэтому, если у двух учеников одинаковые оценки, добавляется только один из них. Из Javadoc:
Экземпляр TreeSet выполняет все сравнения элементов с помощью compareTo (или сравнить), поэтому два элемента, которые считаются равными этому метод с точки зрения множества равен.
Вместо использования TreeSet
вы можете использовать HashSet
и сортировать учащихся по классам, когда вам это нужно (создать новый список, содержащий студентов, отсортировать его и перебрать по нему).
Ответ 7
Вы также можете использовать для каждого, чтобы получить все элементы внутри TreeSet
.
TreeSet<String> words = new TreeSet<String>();
for(String w : words) {
System.out.println(w);
}
Вы можете выполнить итерацию для копирования уникальных слов из TreeSet
в списки, что дает вам право использовать get();
Надеюсь, это помогло.