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