这个问题不久前就有人提过了
Comparable:让元素自身具备比较性,需要元素对象实现Comparable接口,覆盖compareTo方法
如下面的代码:学生对象是不具备比较性的所以让他实现Comparable接口具备比较性
- <P>package doo;
- /*
- * |--TreeSet:可以对Set集合中的元素进行排序
- *
- * 需求:往集TreeSet合中存储自定义对象学生
- * 想按照学生的年龄进行排序
- *
- * 记住:排序时当主要条件相同时,一定要判断一下次要条件
- */
- import java.util.*;
- class Student implements Comparable{//强制让元素具备比较性
- private String name;
- private int age;
- Student(String name,int age){
- this.name=name;
- this.age=age;
- }
- //复写这个接口中的方法,并且让他具备想要的比较性</P>
- <P>public int compareTo(Object obj){
- if(!(obj instanceof Student))
- throw new RuntimeException("不是学生对象!");
- Student s=(Student)obj;
- System.out.println(this.name+"**Comparable**"+s.name);
- if(this.age>s.age)
- return 1;
- if(this.age==s.age){
- return this.name.compareTo(s.name);
- }
- return -1;
- }
- public String getName(){
- return name;
- }
- public int getAge(){
- return age;
- }
- }
- public class VectorDemo {
- public static void main(String[] args) {
- TreeSet ts=new TreeSet();
- //TreeSet会为元素进行排序,但是要求元素具备比较性
- //这里是对象没有比较性,所以要让他具备比较性
- ts.add(new Student("lisi04",24));
- ts.add(new Student("lisi01",20));
- ts.add(new Student("lisi03",22));
- ts.add(new Student("lisi02",21));
- ts.add(new Student("lisi05",24));
- Iterator it=ts.iterator();
- while(it.hasNext()){
- Student s=(Student)it.next();
- sop(s.getName()+"****"+s.getAge());
- }
- }
- public static void sop(Object obj){
- System.out.println(obj);
- }
- }</P>
复制代码
Comparator:让集合自身具备比较性,需要定义一个实现了Comparator接口的比较器,并覆盖compare方法,并将类该对象作为实际参数传递给TreeSet集合的构造函数
如代码:
- package doo;
- /*
- * 练习:按照字符串长度排序
- * 字符串本身具备比较性,但是他的比较方式不是所需要的
- * 这时就能使用比较器
- */
- import java.util.*;
- public class VectorDemo {
- public static void main(String[] args) {
- TreeSet ts=new TreeSet(new StrLenCompare());//将类该对象作为实际参数传递给TreeSet集合的构造函数
- ts.add("abd");
- ts.add("ab");
- ts.add("aaa");
- ts.add("acdsd");
- ts.add("acvd");
- ts.add("a");
- Iterator it=ts.iterator();
- while(it.hasNext()){
- sop(it.next());
- }
- }
- public static void sop(Object obj){
- System.out.println(obj);
- }
- }
- class StrLenCompare implements Comparator{
- public int compare(Object o1,Object o2){
- String s1=(String)o1;
- String s2=(String)o2;
- // if(s1.length()>s2.length())
- // return 1;
- // if(s1.length()==s2.length())
- // return 0;
- int num=new Integer(s1.length()).compareTo(new Integer(s2.length()));
- if(num==0)
- return s1.compareTo(s2);
- return num;
- }
- }
复制代码
第二种方式较为灵活。而且当两种方式都存在时,以比较器为主
|