數據的排序及重排序問題(數據變化需要重排)
大家都知道在集合中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).