在java中迭代树集并更新它
我有一个Java中的在java中迭代树集并更新它,java,Java,我有一个Java中的TreeSet,我有自己的用于此树集的比较器函数。现在,我正在使用DegendingIterator()方法遍历此树集并更改元素。那么,这是否也会将实际树集wrt更新为使用自定义比较器进行排序的方式?或者我需要删除元素并放回更新的元素吗?您需要删除元素并将其添加回。插入元素时,通过将其与其他元素进行比较,确定元素在树中的位置。如果更改对象使与其他元素的比较发生更改,则必须先删除该元素,然后更改它,然后重新添加它 请注意,在迭代时删除元素只能使用迭代器的remove方法。如果没
TreeSet
,我有自己的用于此树集的比较器函数。现在,我正在使用DegendingIterator()
方法遍历此树集并更改元素。那么,这是否也会将实际树集wrt更新为使用自定义比较器进行排序的方式?或者我需要删除元素并放回更新的元素吗?您需要删除元素并将其添加回。插入元素时,通过将其与其他元素进行比较,确定元素在树中的位置。如果更改对象使与其他元素的比较发生更改,则必须先删除该元素,然后更改它,然后重新添加它
请注意,在迭代时删除元素只能使用迭代器的remove方法。如果没有ConcurrentModificationException,您将无法在迭代期间添加它,AFAIK。因此,在迭代结束后,将其存储在要重新添加到集合中的元素列表中。如果修改作为“键”(由自定义比较器定义)一部分的对象的任何部分,则需要删除并重新插入树集合的对象,以“了解”更改。您也不应该在迭代时这样做:一个好的方法是在一个循环中收集需要更改的项,然后在另一个循环中修改并重新插入它们。一般经验法则是,不建议“修改”添加到Java容器中的任何依赖于相等性的值类型,假设已知的标准容器都不执行自动平衡或调整以响应值的变化(这是有意义的),则哈希代码等 与
Set
一起,此规则对Map
类型同样有效。如果您在地图上迭代并在适当的位置修改“键”,则情况会变糟。这就是为什么建议将不可变类型作为映射键的原因(想想String
,Integer
等等)。您的情况可以通过一个简单的示例来演示:
public class Test {
public static void main(final String[] args) {
Mutable m1 = new Mutable(1);
Mutable m2 = new Mutable(2);
Mutable m3 = new Mutable(3);
Mutable m4 = new Mutable(4);
TreeSet<Mutable> ts = new TreeSet<Mutable>(new Cmp());
ts.add(m1); ts.add(m2); ts.add(m3); ts.add(m4);
System.out.println(ts);
for (Iterator<Mutable> iter = ts.iterator(); iter.hasNext(); ) {
Mutable m = iter.next();
if (m.i == 1 || m.i == 3) {
m.i = m.i + 10;
}
}
System.out.println(ts);
}
}
class Mutable {
public int i;
public Mutable(int i) {
this.i = i;
}
public String toString() {
return "Mutable[" + i + "]";
}
}
class Cmp implements Comparator<Mutable> {
@Override public int compare(Mutable o1, Mutable o2) {
return Integer.valueOf(o1.i).compareTo(Integer.valueOf(o2.i));
}
}
Output:
[Mutable[1], Mutable[2], Mutable[3], Mutable[4]]
[Mutable[11], Mutable[2], Mutable[13], Mutable[4]]
公共类测试{
公共静态void main(最终字符串[]args){
可变m1=新的可变(1);
可变m2=新的可变(2);
可变m3=新可变(3);
可变m4=新可变(4);
树集ts=新树集(新Cmp());
增加(m1);增加(m2);增加(m3);增加(m4);
系统输出打印项次(ts);
for(迭代器iter=ts.Iterator();iter.hasNext();){
可变m=iter.next();
如果(m.i==1 | | m.i==3){
m、 i=m.i+10;
}
}
系统输出打印项次(ts);
}
}
类可变{
公共国际一级;
公共可变(int i){
这个。i=i;
}
公共字符串toString(){
返回“可变[”+i+“]”;
}
}
类Cmp实现比较器{
@覆盖公共整数比较(可变o1,可变o2){
返回Integer.valueOf(o1.i).compareTo(Integer.valueOf(o2.i));
}
}
输出:
[可变[1],可变[2],可变[3],可变[4]]
[Mutable[11],Mutable[2],Mutable[13],Mutable[4]]
发布您正在尝试的代码。这是一个很长的代码,是一些大代码的一部分,因此无法放置代码,因此有人可以从概念上解释,这是否正确