1700445691
1700445692
很可惜,竟然没有重新排序,偏离了我们的预期。这正是下面要说明的问题,SortedSet接口(TreeSet实现了该接口)只是定义了在给集合加入元素时将其进行排序,并不能保证元素修改后的排序结果,因此TreeSet适用于不变量的集合数据排序,比如String、Integer等类型,但不适用于可变量的排序,特别是不确定何时元素会发生变化的数据集合。
1700445693
1700445694
原因知道了,那如何解决此类重排序问题呢?有两种方式:
1700445695
1700445696
(1)Set集合重排序
1700445697
1700445698
重新生成一个Set对象,也就是对原有的Set对象重排序,代码如下:
1700445699
1700445700
public static void main(String[]args){
1700445701
1700445702
SortedSet<Person>set=new TreeSet<Person>();
1700445703
1700445704
//身高180CM
1700445705
1700445706
set.add(new Person(180));
1700445707
1700445708
//身高175CM
1700445709
1700445710
set.add(new Person(175));
1700445711
1700445712
//身高最矮的人大变身
1700445713
1700445714
set.first().setHeight(185);
1700445715
1700445716
//set重排序
1700445717
1700445718
set=new TreeSet<Person>(new ArrayList<Person>(set));
1700445719
1700445720
}
1700445721
1700445722
就这一句话即可重新排序。可能有读者会问,使用TreeSet(SortedSet<E>s)这个构造函数不是可以更好地解决问题吗?不行,该构造函数只是原Set的浅拷贝,如果里面有相同的元素,是不会重新排序的。
1700445723
1700445724
(2)彻底重构掉TreeSet,使用List解决问题
1700445725
1700445726
我们之所以使用TreeSet是希望实现自动排序,即使修改也能自动排序,既然它无法实现,那就用List来代替,然后再使用Collections.sort()方法对List排序,代码较简单,不再赘述。
1700445727
1700445728
两种方法都可以解决我们的困境,到底哪一个是最优的呢?对于不变量的排序,例如直接量(也就是8个基本类型)、String类型等,推荐使用TreeSet,而对于可变量,例如我们自己写的类,可能会在逻辑处理中改变其排序关键值的,则建议使用List自行排序。
1700445729
1700445730
又有问题了,如果需要保证集合中元素的唯一性,又要保证元素值修改后排序正确,那该如何处理呢?List不能保证集合中的元素唯一,它是可以重复的,而Set能保证元素唯一,不重复。如果采用List解决排序问题,就需要自行解决元素重复问题(若要剔除也很简单,转变为HashSet,剔除后再转回来)。若采用TreeSet,则需要解决元素修改后的排序问题,孰是孰非,就需要根据具体的开发场景来决定了。
1700445731
1700445732
注意 SortedSet中的元素被修改后可能会影响其排序位置。
1700445733
1700445734
1700445735
1700445736
1700445738
编写高质量代码:改善Java程序的151个建议 建议82:由点及面,一叶知秋—集合大家族
1700445739
1700445740
Java中的集合类实在是太丰富了,有常用的ArrayList、HashMap,也有不常用的Stack、Queue,有线程安全的Vector、HashTable,也有线程不安全的LinkedList、TreeMap,有阻塞式的ArrayBlockingQueue,也有非阻塞式的PriorityQueue等,整个集合家族非常庞大,而且也是错综复杂,可以划分为以下几类:
[
上一页 ]
[ :1.700445691e+09 ]
[
下一页 ]