при поддержании вида TreeSet, поскольку объект изменяет значение

У меня есть объект, который определяет 'естественный порядок сортировки' использование Сопоставимого <>. Они хранятся в TreeSets.

Кроме удаления и передобавления объекта, там другой способ обновить вид, когда участники, которые используются для определения порядка сортировки, обновляются?

69
задан kriegaex 20 June 2012 в 18:55
поделиться

5 ответов

Как отмечали другие, встроенного способа не существует. Но вы всегда можете создать подкласс этого 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 () в вашем объекте данных.

14
ответ дан 24 November 2019 в 13:56
поделиться

Если вам действительно нужно использовать Set , я думаю, вам не повезло.

Я собираюсь добавить подстановочный знак - если ваша ситуация достаточно гибкая для работы со списком List вместо Set , тогда вы можете использовать Collections.sort () для повторной сортировки списка по запросу. Это должно быть эффективным, если порядок List не нужно сильно менять.

3
ответ дан 24 November 2019 в 13:56
поделиться

Встроен только способ удаления и повторного добавления.

0
ответ дан 24 November 2019 в 13:56
поделиться

Это помогает узнать, будут ли ваши объекты изменяться - маленькими или большими. Если каждое изменение очень небольшое, вам следует поместить свои данные в список, который вы сохраняете отсортированным. Для этого вы должны

  1. binarySearch найти индекс элемента
  2. изменить элемент
  3. , пока элемент больше, чем его правый сосед, поменять местами его правого соседа
  4. или, если это не так. Этого не происходит: пока элемент меньше, чем его левый сосед, поменяйте местами его со своим левым соседом.

Но вы должны быть уверены, что никто не сможет изменить элемент, не пройдя через «вас».

РЕДАКТИРОВАТЬ: Также! В Glazed Lists есть некоторая поддержка именно этого:

http://publicobject.com/glazedlists/glazedlists-1.5.0/api/ca/odell/glazedlists/ObservableElementList.html

1
ответ дан 24 November 2019 в 13:56
поделиться

Я не думаю, что есть готовый способ сделать это.

Вы можете использовать шаблон наблюдателя, который уведомляет набор деревьев всякий раз, когда вы изменяете значение внутри элемента, затем удаляет и снова вставляет его.

Таким образом, вы можете неявно поддерживать сортировку списка, не заботясь о том, чтобы делать это вручную. Конечно, такой подход потребует расширения TreeSet путем изменения поведения при вставке (установка механики observed/notify на только что добавленном элементе)

.
-1
ответ дан 24 November 2019 в 13:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: