Почему 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();

Надеюсь, это помогло.