數據的排序及重排序問題(數據變化需要重排)

數據的排序及重排序問題(數據變化需要重排)

大家都知道在集合中TreeSet會去除重複數據並對數據進行排序(默認升序,可以使用Comparable接口的CompareTo 方法改變排序方式),但是當排好的數據發生變化時,它能否重新排序呢?
示例如下:

public class test {
    public static <E> void main(String[] args) {
        Set<Person> set = new TreeSet<Person>();
        set.add(new Person(180));
        set.add(new Person(175));
        for (Person p : set) {
            System.out.println(p);

            if (p.getHeight() == 175) {
                p.setHeight(p.getHeight() + 10);
            }
        }
        System.out.println("-----------------------------");
        for (Person p : set) {
            System.out.println(p);
        }
    }
}

結果:
Person [height=175]
Person [height=180]

Person [height=185]
Person [height=180]

在數值改變後,並沒有發生重新排序,這是怎麼回事兒呢?
是這樣的TreeSet只是定義了在給集合加入元素時將其進行排序,並不能 保證元素修改後的排序結果,因此TreeSet適用於不變量的集合數據排序, 比如String,Integer等類型,但不適用於可變量的排序,特別是不確定何時元素會發生變化的數據集合.
那怎麼解決此類重排問題呢?有兩種:
1 Set集合重排序

public class test {
    public static <E> void main(String[] args) {
        SortedSet<Person> set = new TreeSet<Person>();
        set.add(new Person(180));
        set.add(new Person(175));
        for (Person p : set) {
            System.out.println(p);

            if (p.getHeight() == 175) {
                p.setHeight(p.getHeight() + 10);
            }
        }
        System.out.println("-----------------------------");
        set = new TreeSet<Person>(new ArrayList<Person>(set));
        for (Person p : set) {
            System.out.println(p);
        }
    }
}

2 徹底重構掉TreeSet,使用List解決問題 直接使用List來代替,然後再使用Collections.sort()方法 對List排序(使用comparator).

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章