一、首先明确TreeSet与HashSet的区别:
1、底层实现不同:TreeSet通过TreeMap实现,数据结构为二叉树,HashSet通过HashMap实现,只通过key值来实现,数据结构为哈希表。
2、共同点是集合的唯一性。
3、不同点事TreeSet是有序的,HashSet是无序的关于HashSet的唯一性实现详见[url=学习分享 hashcode()与equals() 基于哈希表的集合HashSet http://bbs.itheima.com/thread-174387-1-1.html (出处: 黑马程序员IT技术论坛)]hashcode()与equals() 学习[/url]。
二、TreeSet有序性的实现方法
1、通过在定义类的时候实现Comparable接口来实现:
comparable实现类的子
示例代码:
- import java.util.*;
-
- class TreeSetDemo2
- {
- public static void main(String[] args)
- {
- TreeSet ts = new TreeSet();
-
- ts.add(new Student("lisi0",30));
- ts.add(new Student("lisixx",29));
- ts.add(new Student("lisi9",29));
- ts.add(new Student("lisi8",38));
- ts.add(new Student("lisixx",29));
- ts.add(new Student("lisi4",14));
- //ts.add(new Student(39));
- ts.add(new Student("lisi7",27));
-
-
-
- System.out.println(ts);
- }
- }
-
- //同姓名同年龄的学生视为同一个学生。按照学生的年龄排序。
- class Student implements Comparable
- {
- private int age;
- private String name;
- Student(String name,int age)
- {
- this.age = age;
- this.name = name;
- }
-
- public int compareTo(Object obj)
- {
- Student stu = (Student)obj;
- int num = new Integer(this.age).compareTo(new Integer(stu.age));
- return num==0?this.name.compareTo(stu.name):num;
- /*
- if(this.age>stu.age)
- return 1;
- if(this.age==stu.age)
- return this.name.compareTo(stu.name);
- return -1;
- */
- /**/
- }
- public int getAge()
- {
- return age;
- }
- public String toString()
- {
- return name+"::"+age;
- }
- }
复制代码 但是,如果元素自身不具备比较性,或者元素自身具备的比较性,不是所需要的。
比如,学生的自然排序是按年龄排序,现在想要按照学生姓名排序。还可以不改动原有代码。
这时怎么办呢?
排序的第二种方式:自定比较器的方式。
这时可以让集合自身具备比较性。
可以定义一个类实现Comparator接口,覆盖compare方法。将该Comparator接口子类对象作为实际参数
传递给TreeSet集合构造函数。该对象就是比较器。
- import java.util.*;
- class TreeSetDemo3
- {
- public static void main(String[] args)
- {
- TreeSet ts = new TreeSet(new StudentComparatorByName());
- ts.add(new Student("lisi0",30));
- ts.add(new Student("lisixx",29));
- ts.add(new Student("lisi9",29));
- ts.add(new Student("lisi8",38));
- ts.add(new Student("lisixx",29));
- ts.add(new Student("lisi4",14));
- //ts.add(new Student(39));
- ts.add(new Student("lisi7",27));
- System.out.println(ts);
- }
- }
- class StudentComparatorByName implements Comparator
- {
- public int compare(Object o1,Object o2)
- {
- Student s1 = (Student)o1;
- Student s2 = (Student)o2;
- int num = s1.getName().compareTo(s2.getName());
- return num==0?new Integer(s1.getAge()).compareTo(new Integer(s2.getAge())):num;
- }
- }
- //同姓名同年龄的学生视为同一个学生。按照学生的年龄排序。
- class Student implements Comparable
- {
- private int age;
- private String name;
- Student(String name,int age)
- {
- this.age = age;
- this.name = name;
- }
- public int compareTo(Object obj)
- {
- Student stu = (Student)obj;
- int num = new Integer(this.age).compareTo(new Integer(stu.age));
- return num==0?this.name.compareTo(stu.name):num;
- /*
- if(this.age>stu.age)
- return 1;
- if(this.age==stu.age)
- return this.name.compareTo(stu.name);
- return -1;
- */
- /**/
- }
- public int getAge()
- {
- return age;
- }
- public String getName()
- {
- return name;
- }
- public String toString()
- {
- return name+"::"+age;
- }
- }
-
复制代码
|