Set 中的 SortedSet(SortedSet 为 TreeSet 的实现接口), 它们之间的继承关系如下:
- java.util.Set;
- java.util.SortedSet;
- java.util.TreeSet;
SortedSet 中的元素无序不可重复, 但是存进去的元素可以按照元素大小顺序自动排序. 结合以下代码来看:
- import java.util.*;
- import java.text.*;
- public class SortedSetTest01{
- public static void main(String[] args)throws Exception{
- SortedSet ss=new TreeSet();
- // 数字类
- ss.add(12);
- ss.add(23);
- ss.add(45);
- ss.add(39);
- ss.add(45);
- Iterator it=ss.iterator();
- while(it.hasNext()){
- System.out.println(it.next());
- }
- //String 类
- SortedSet str=new TreeSet();
- str.add("JACK");
- str.add("TOM");
- str.add("KING");
- str.add("SUN");
- it=str.iterator();
- while(it.hasNext()){
- System.out.println(it.next());
- }
- // 日期类
- String st1="2003-08-12";
- String st2="2004-09-17";
- String st3="2003-04-12";
- String st4="2013-09-04";
- SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
- Date t1=sdf.parse(st1);
- Date t2=sdf.parse(st2);
- Date t3=sdf.parse(st3);
- Date t4=sdf.parse(st4);
- SortedSet times=new TreeSet();
- times.add(t1);
- times.add(t2);
- times.add(t3);
- times.add(t4);
- it=times.iterator();
- while(it.hasNext()){
- Object element=it.next();
- if(element instanceof Date){
- Date d=(Date)element;
- System.out.println(sdf.format(d));
- }
- }
- }
- }
编译运行后输出:
- 12
- 23
- 39
- 45
- JACK
- KING
- SUN
- TOM
- 2003-04-12
- 2003-08-12
- 2004-09-17
- 2013-09-04
以上代码展示了存在 SortedSet 中的元素可以按照元素大小进行排序, 这些元素可以是数字类, 字符串类或日期类等. 既然知道了 SortedSet 的这一特性, 那么 SortedSet 集合存储元素为什么可以自动排序?
在上面的代码中我们实现了 SortedSet 中的数字, 字符串和日期类的自动排序, 那么如果我们自定义几个 User 类型对象, 然后把它们添加到 SortedSet 集合中去, 可以实现像上面那样的自动排序吗? 试一下.
- import java.util.*;
- public class SortedSetTest02{
- public static void main(String[] args){
- SortedSet users=new TreeSet();
- User u1=new User(12);
- User u2=new User(16);
- User u3=new User(23);
- User u4=new User(32);
- User u5=new User(43);
- users.add(u1);
- users.add(u2);
- users.add(u3);
- users.add(u4);
- users.add(u5);
- Iterator it=users.iterator();
- while(it.hasNext()){
- System.out.println(it.next());
- }
- }
- }
- class User{
- int age;
- User(int age){
- this.age=age;
- }
- public String toString(){
- return "User[age="+age+"]";
- }
- }
编译通过, 运行后出错, 输出:
- Exception in thread "main" java.lang.ClassCastException: User cannot be cast to java.lang.Comparable
- at java.util.TreeMap.compare(Unknown Source)
- at java.util.TreeMap.put(Unknown Source)
- at java.util.TreeSet.add(Unknown Source)
- at SortedSetTest02.main(SortedSetTest02.java:14)
User cannot be cast to java.lang.Comparable, 也就是说 User 不可以转变成可比较的类型. 所以 User 必须实现 Comparable 接口 (也就是第一个程序例子中数字, 字符串, 日期底层已经实现了 Comparable 接口), 即 class User implements Comparable{ }. 我们知道一个类实现一个接口就实现了这个接口的所有方法, SortedSet 集合中的元素之所以可以自动排序, 是因为使用 add() 方法添加进去的元素实现了 Comparable 接口中的 CompareTo()方法.
上述代码中, 如果我们给定一个需求, 按照 User 的年龄排序, 那么就需要编写一个比较规则,
- public int compareTo(Object o){
- // 编写一个比较规则
- int age1=this.age;
- int age2=((User)o).age;
- return age1-age2;
- }
compareTo 的用法为 u1.compareTo(u2),this 为 u1, 括号里的参数 o 为 u2, 因为括号里的参数类型为 Object 类型, 而 Object 类型没有 age 这个属性, 所以必须把 o 强制类型转换为 User 类型, 即(User)o. 修改之后的整体代码如下:
- import java.util.*;
- public class SortedSetTest02{
- public static void main(String[] args){
- SortedSet users=new TreeSet();
- User u1=new User(12);
- User u2=new User(16);
- User u3=new User(23);
- User u4=new User(32);
- User u5=new User(43);
- users.add(u1);
- users.add(u2);
- users.add(u3);
- users.add(u4);
- users.add(u5);
- Iterator it=users.iterator();
- while(it.hasNext()){
- System.out.println(it.next());
- }
- }
- }
- class User implements Comparable{
- int age;
- User(int age){
- this.age=age;
- }
- public String toString(){
- return "User[age="+age+"]";
- }
- // 实现 java.lang.Comparable; 接口中的 compareTo 方法
- // 该方法程序员负责实现, SUN 提供的程序已经调用了该方法
- // 需求: 按照 User 的年龄排序
- public int compareTo(Object o){ //u1.compareTo(u2)
- // 编写一个比较规则
- int age1=this.age;
- int age2=((User)o).age;
- return age1-age2;
- }
- }
编译运行后输出:
- User[age=12]
- User[age=16]
- User[age=23]
- User[age=32]
- User[age=43]
除此之外, 还有另一种方法实现 SortedSet 集合排序: 使用 java.util.Comparator; 来单独编写一个比较器, 创建 TreeSet 集合的时候提供这个比较器, 即 SortedSet products=new TreeSet(new ProductComparator()); 代码如下:
- import java.util.*;
- public class SortedSetTest03{
- public static void main(String[] args){
- // 创建 TreeSet 集合的时候提供一个比较器
- SortedSet products=new TreeSet(new ProductComparator());
- Product p1=new Product(3.4);
- Product p2=new Product(4.0);
- Product p3=new Product(3.6);
- Product p4=new Product(7.6);
- Product p5=new Product(3.7);
- products.add(p1);
- products.add(p2);
- products.add(p3);
- products.add(p4);
- products.add(p5);
- Iterator it=products.iterator();
- while(it.hasNext()){
- System.out.println(it.next());
- }
- }
- }
- class Product{
- double price;
- Product(double price){
- this.price=price;
- }
- public String toString(){
- return price + "";
- }
- }
- // 单独编写一个比较器
- class ProductComparator implements Comparator{
- // 需求: 按照商品价格排序
- public int compare(Object o1,Object o2){
- double price1=((Product)o1).price;
- double price2=((Product)o2).price;
- if (price1==price2){
- return 0;
- }else if(price1>price2){
- return -1;
- }
- return 1;
- }
- }
编译运行后输出:
- 7.6
- 4.0
- 3.7
- 3.6
- 3.4
来源: http://www.bubuko.com/infodetail-2742962.html