这个主要清楚分别用在什么地方,就很容易明白:
TreeSet我们知道可以对Set集合中的元素进行排序
而排序有两种方法:
1.让元素自身具有比较性,举个例子。我们知道Person类的对象是不具备比较性的,而我们又需要对对象进行排,所以我们可以人为的定义,让对象具有比较性。明白这一点后,就好似怎么实现可比较性了。这时第一种方法就出现了。让Person类实现comparable接口,覆盖接口中的compareTo方法
这种方式也叫做元素的自然排序,或者叫做默认顺序。
所谓元素自身不具备比较性,其实很好理解。例如两个人有比较性吗?没有,要比较也得是你定义比较规则,例如谁年龄长,谁身高高,谁挣钱多。等等。
正是由于对象没有比较性,所以我们才在类中定义比较性,让其具有可比较性。这就是TreeSet实现排序的第一种方式。当时这种方式仅限于同类对象进行比较,例如人和人比较,但是实现不同类型的对象比较时,这种方法就不行了。
Treeset中的第二种比较方式,比较通用。我们知道,如果对象元素不具备比较性,我们可以让装它的容器具备可比较性。这就是第二种方法的出发点。
实现方法是:
定义一个类,实现Comparetor接口,覆盖compare方法。
使用时要想分清到底使用什么方法。首先看你的比较对象元素时什么类型的。一般使用第二种,即比较器
注意要记住:
Comparetor中是compare方法
而Comparable中是compareTo方法
希望能帮到你。
给一个毕老师视频中的例子:- class TreeSetDemo2
- {
- public static void main(String[] args)
- {
- TreeSet ts = new TreeSet(new MyCompare());
- //使用构造器TreeSet(Comparator<? super E> comparator)
- ts.add(new Student("lisi03",22));
- ts.add(new Student("lisi02",20));
- ts.add(new Student("lisi09",19));
- ts.add(new Student("lisi01",18));
- ts.add(new Student("lisi01",18));
- Iterator it= ts.iterator();
- while(it.hasNext())
- {
- Student p = (Student)it.next();
- sop(p.getName()+"..."+p.getAge());
- }
- }
- public static void sop(Object obj)
- {
- System.out.println(obj);
- }
- }
- class MyCompare implements Comparator
- {
- public int compare(Object o1,Object o2)
- {
- Student s1= (Student)o1;
- Student s2= (Student)o2;
- int num = s1.getName().compareTo(s2.getName());
- if(num==0)
- {
- return new Integer(s1.getAge()).compareTo(new Integer(s2.getAge()));
- /*
- if(s1.getAge()>s2.getAge())
- return 1;
- if(s1.getAge()==s2.getAge())
- return 0;
- return -1;
- */
- }
- return num;
- }
- }
- class Student implements Comparable//该接口强制让学生具备可比性
- {
- private String name;
- private int age;
- Student(String name,int age)
- {
- this.name=name;
- this.age=age;
- }
- public String getName()
- {
- return name;
- }
- public int getAge()
- {
- return age;
- }
- public int compareTo(Object obj)//覆盖的方法不能声明
- {
- if(!(obj instanceof Student))
- throw new RuntimeException("不是学生对象");
- Student s= (Student)obj;
- System.out.println(this.name+"..compareto.."+s.name);
- if (this.age>s.age)
- return 1;
- if(this.age==s.age)
- {
- return this.name.compareTo(s.name);
- }
- return -1;
- }
- }
复制代码 |