У меня есть объект, который определяет 'естественный порядок сортировки' использование Сопоставимого <>. Они хранятся в TreeSets.
Кроме удаления и передобавления объекта, там другой способ обновить вид, когда участники, которые используются для определения порядка сортировки, обновляются?
Как отмечали другие, встроенного способа не существует. Но вы всегда можете создать подкласс этого TreeSet с помощью выбранного вами конструктора и добавить необходимую функциональность:
public class UpdateableTreeSet<T extends Updateable> extends TreeSet<T> {
// definition of updateable
interface Updateable{ void update(Object value); }
// constructors here
...
// 'update' method; returns false if removal fails or duplicate after update
public boolean update(T e, Object value) {
if (remove(e)) {
e.update(value);
return add(e);
} else {
return false;
}
}
}
С этого момента вам придется вызывать ((UpdateableTreeSet) mySet) .update (anElement, aValue)
, чтобы обновить значение сортировки и саму сортировку. Это требует от вас реализации дополнительного метода update ()
в вашем объекте данных.
Если вам действительно нужно использовать Set
, я думаю, вам не повезло.
Я собираюсь добавить подстановочный знак - если ваша ситуация достаточно гибкая для работы со списком List
вместо Set
, тогда вы можете использовать Collections.sort ()
для повторной сортировки списка
по запросу. Это должно быть эффективным, если порядок List
не нужно сильно менять.
Встроен только способ удаления и повторного добавления.
Это помогает узнать, будут ли ваши объекты изменяться - маленькими или большими. Если каждое изменение очень небольшое, вам следует поместить свои данные в список, который вы сохраняете отсортированным. Для этого вы должны
Но вы должны быть уверены, что никто не сможет изменить элемент, не пройдя через «вас».
РЕДАКТИРОВАТЬ: Также! В Glazed Lists есть некоторая поддержка именно этого:
Я не думаю, что есть готовый способ сделать это.
Вы можете использовать шаблон наблюдателя, который уведомляет набор деревьев всякий раз, когда вы изменяете значение внутри элемента, затем удаляет и снова вставляет его.
Таким образом, вы можете неявно поддерживать сортировку списка, не заботясь о том, чтобы делать это вручную. Конечно, такой подход потребует расширения TreeSet
путем изменения поведения при вставке (установка механики observed/notify на только что добавленном элементе)