保持TreeSet排序为对象更改值

Ste*_*vko 69 java collections refresh sortedset treeset

我有一个使用Comparable <>定义'自然排序顺序'的对象.这些存储在TreeSet中.

除了删除和重新添加对象之外,还有另一种方法可以在更新用于定义排序顺序的成员时更新排序吗?

tuc*_*uxi 14

正如其他人所指出的那样,没有内置的方式.但是您总是可以使用您选择的构造函数对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;
       }
    }
}
Run Code Online (Sandbox Code Playgroud)

从那时起,您将不得不调用((UpdateableTreeSet)mySet).update(anElement, aValue)更新排序值和排序本身.这确实需要您update()在数据对象中实现其他方法.


kri*_*aex 5

我有一个类似的问题,找到了这个帖子和tucuxi的答案(谢谢!),基于此我实现了自己的UpdateableTreeSet.我的版本提供了手段

  • 迭代这样一个集合,
  • 循环内的schedule(延迟)元素更新/删除
  • 无需创建集合的临时副本,最后
  • 在循环结束后,将所有更新/删除作为批量操作执行.

UpdateableTreeSet从用户隐藏了很多复杂性.除了延迟批量更新/删除之外,tucuxi所示的单元素更新/删除仍然可用于该类.

更新2012-08-07:该类在一个小GitHub存储库中可用,包括带有原理图示例代码的介绍性自述文件以及显示如何(不)更详细地使用它的单元测试.