我的问题很基本,但是我不知道如何正确解决。我有一个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/