当元素在遍历过程中发生变化时,treesset的行为



这可能是一个新手问题,如果我在遍历TreeSet时更改元素会发生什么?这会导致集合中元素的重新排序吗?

会导致集合中元素的重新排序吗?

不,改变集合中的元素不会导致树集的重新排序。您不应该这样做,因为一旦您进行了改变顺序的突变,您的元素可能会在树中丢失。你应该做的是删除元素,改变它的属性,改变它的顺序,然后重新插入它。

考虑这个示例类:

class Student : Comparable<Student> {
    private String name;
    public Student(String name) {this.name = name;}
    public final String getName() {return name;}
    public final void setName(String name) { this.name = name;}
    public int compareTo<Student>(Student other) {
        return name.compareTo(other.name);
    }
}

如果你做一个这样的树集

TreeSet<Student,Integer> gradeInMath = ...

,当学生的名字已经在集合中时,你应该这样做:

Student nameChangeStudent = new Student("Joe");
Integer theGrade = gradeInMath.remove(nameChangeStudent);
nameChangeStudent.setName("Jack");
gradeInMath.put(nameChangeStudent, theGrade);
如您所见,这一点也不美观。这就是为什么作为一般规则,您应该为您的映射选择不可变的键,无论是基于哈希的还是基于树的。

最新更新