维护树设置在对象更改值时排序

2022-08-31 11:53:34

我有一个对象,它使用Compeable<>定义了“自然排序顺序”。它们存储在树集中。

除了删除并重新添加对象之外,在更新用于定义排序顺序的成员时,是否有其他方法可以更新排序?


答案 1

正如其他人所指出的那样,没有内在的方式。但是,您始终可以使用您选择的构造函数对该树集进行子类化,并添加所需的功能:

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()


答案 2

我有一个类似的问题,找到了这个线程和tucuxi的答案(谢谢!),基于它我实现了我自己的。我的版本提供了UpdateableTreeSet

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

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

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