Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中迭代树集并更新它_Java - Fatal编程技术网

在java中迭代树集并更新它

在java中迭代树集并更新它,java,Java,我有一个Java中的TreeSet,我有自己的用于此树集的比较器函数。现在,我正在使用DegendingIterator()方法遍历此树集并更改元素。那么,这是否也会将实际树集wrt更新为使用自定义比较器进行排序的方式?或者我需要删除元素并放回更新的元素吗?您需要删除元素并将其添加回。插入元素时,通过将其与其他元素进行比较,确定元素在树中的位置。如果更改对象使与其他元素的比较发生更改,则必须先删除该元素,然后更改它,然后重新添加它 请注意,在迭代时删除元素只能使用迭代器的remove方法。如果没

我有一个Java中的
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]]

发布您正在尝试的代码。这是一个很长的代码,是一些大代码的一部分,因此无法放置代码,因此有人可以从概念上解释,这是否正确