Почему у TreeSet Java нет метода get ()?
Что делать, если я хочу получить и обновить объекты, хранящиеся в TreeSet?
причина, по которой я спрашиваю, заключается в том, что я хочу иметь возможность поддерживать некоторую структуру данных, которая будет хранить студентов. Я хочу, чтобы он был отсортирован (по классам - это переменная экземпляра Student), и - он должен быть отсортирован даже после обновления одного (или нескольких) классов.
Итак, после краткого просмотра коллекций Java, я решил пойти с TreeSet и установить компаратор, который сравнивает двух студентов по их оценкам. проблема в том, что я только что узнал, что TreeSet не имеет метода get ()!
любая помощь и предложения будут с благодарностью.
9 ответов
что бы вы ожидаете get()
метод Set
делать?
- наборы не индексируются, поэтому
get(int index)
нет смысла. (ИспользуйтеList
Если вы хотите получить элементы по индексу). -
get(Object obj)
также не имеет смысла, потому что у вас будет объект, который вы пытаетесь получить уже. - уже есть
contains()
метод для проверки, еслиSet
содержит объект. - вы можете перебирать
Set
Если вы хотите сделать что-то со всеми элементами в наборе.
вы можете получить элементы из набора деревьев с помощью итератора. Вы можете попробовать что-то вроде этого:
Iterator<Integer> it = treeSet.iterator();
Integer current = 0;
while(it.hasNext() ) {
current = it.next();
}
надеюсь, что это помогает.
У меня есть случай, когда я использую два TreeSets (потому что быстрее в поиске). Одно из этих деревьев огромно, и объекты в деревьях разные, поэтому я создаю макет объекта (типа 2, второе дерево), в котором есть поля, используемые для сортировки, используя данные из объекта из небольшого дерева и проверяю, есть ли аналог на втором. Теперь мне нужно проверить значение из объекта, найденного во втором дереве, чтобы добавить значение в отчет.
использование итератора вместо двоичного поиск, чтобы получить объект, который мне нужен, побеждает цель использования двоичного дерева. Второе дерево-5GB plus, поиск совпадений с данными в первом дереве (200MB). Мне нужна стратегия поиска, которая имеет смысл для этого огромного количества данных, поэтому я выбрал двоичное дерево поиска. Записи уникальны.
обычно вы не хотите извлекать элемент в наборе, когда он у вас уже есть. Вы можете удалить свой элемент из набора или узнать, принадлежит ли он набору, вот и все. Знать, что вы хотите сделать, - это индексировать своих учеников по классам, поэтому индекс-это класс, а не сам объект. Карту это решение.
на вашем месте я бы использовал следующую структуру, которая извлекает всех студентов с помощью тот же класс быстро (они сортируются по классам тоже) :
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 в вашем классе студента, чтобы заставить его работать правильно.
вы также можете проверить библиотеку cqengine, если хотите выполнить индексации java легко и быстро, но решение, представленное выше, просто нормально для вашего использования.
можно выполнить итерацию дерева для извлечения его объектов. Насчет NavigableSet? существуют методы ближней навигации, как
E ceiling(E e) E floor(E e)
E higher(E e) E lower(E e)
на TreeSet
is сортируются при вставке. Если вы заказываете оценки студентов и модифицируете их после при добавлении элементы больше не сортируются (в том же порядке, что и раньше).
на TreeSet
также не использовать equals()
чтобы определить, добавлен ли элемент, но вместо этого использует компаратор (тот же порядок = тот же элемент). Поэтому, если два студента имеют одинаковые оценки, добавляется только один из них. От Javadoc:
экземпляр TreeSet выполняет все сравнения элементов с помощью compareTo (или сравнить) метод, поэтому два элемента, которые считаются равными этим методы, с точки зрения множества, равны.
вместо TreeSet
, вы можете использовать HashSet
и сортировка студентов по классам, когда они вам нужны (создайте новый список, содержащий студентов, отсортируйте его и повторите его).
если он содержит точный объект, пол вернет точный объект, который вы ищете.
if(set.contains(searchingObject)) {
addonPartNumber = p.floor(searchingObject);
}
вы также можете использовать для каждого, чтобы получить все элементы внутри TreeSet
.
TreeSet<String> words = new TreeSet<String>();
for(String w : words) {
System.out.println(w);
}
вы можете выполнить итерацию, чтобы скопировать уникальные слова из TreeSet
в списки, что дает вам право использовать get();
надеюсь, это помогло.
это ответ на проблему, которую я нашел для себя, но я думал, что должен быть get(elem)
для наборов, но как вы знаете, нет.
здесь вы идете:
set.subSet(elem,true,elem,true).floor(elem);
возвращает первое объект это равно тому, который вы ищете.
Примечание: Элем должно быть равно с элементом, который вы ищете, и вы получаете объект, который хотите или назначение компаратора к набору, который соответствует им как равна.
Я был удивлен, что никто не придумал его раньше.
большие пальцы вверх необходимо: D