我的问题很基本,但是我不知道如何正确解决。我有一个TreeSet,它使用基于实体名称的比较器。但是,我可以更改该名称。如何强制对TreeSet进行重新排序?

TreeSet<MyEntity> set = new TreeSet<MyEntity>(new BeanComparator("name"));
// bar < foo < xander
set.add(foo);
set.add(bar);
set.add(xander);
// resulting tree:     _-foo-_
//                   bar    xander
xander.setName("apple");

set.contains(xander); // -> false, since now neither 'foo' or 'bar' are equal to 'xander'


我应该调用某些set.relayout()方法吗,还是我会出错呢?

最佳答案

如果在更改元素名称时具有指向TreeSet的链接,则只需从集合中删除该元素,更改其名称,然后再插入即可。

如果您在更新名称时没有该链接,则建议将其作为MyEntity中的私有字段,并将setName()重写为

public class MyEntity {
  private final TreeSet<MyEntity> container;

  ...

  public void setName(final String name) {
    container.remove(this);
    this.name = name;
    container.add(this);
  }
}


但是,这种方法非常丑陋。你最好避免它。

关于java - 基于可变属性的TreeSet比较器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9007776/

10-11 18:50