JAVA集合中Comparable与Comparator区别。

   今天在打代码的时候,我犯了一个错误,我把Comparator当成了Comparable,所以为了以后大家不要犯和我一样的错误,我发表了一篇博客,给大家介绍一下ComparableComparator区别。
   Comparator在汉语中的意思是比较器Comparable在汉语中的意思是可比的

   集合中的元素在进行比较时,都会调用compareTo()方法,该方法就是Comparable接口中的定义,因此要想对集合中元素进行排序,就必须实现Comparable的接口。

  • package com.baidu.Comparable;

    public class Student implements Comparable<Student>{
    private String name;
    private int age;
    public Student(){
    super();
    }
    public Student (String name,int age){
    this.name=name;
    this.age=age;
    }
    public String getName(){
    return name;
    }
    public int getAge(){
    return age;
    }
    public String setName(String ename){
    this.name=ename;
    return name;
    }
    public int setAge(int ages){
    this.age=ages;
    return age;
    }
    public int compareTo(Student s){ 
    int num=this.name.length()-s.name.length();
    int num2=num==0?this.name.compareTo(s.name):num;
    int num3=num2==0?this.age-s.age:num2;
    return num3;
    }
    @Override
    public String toString() {
    return "student [name=" + name + ", age=" + age + "]";
    }
    }
  • ----------------------------------------------------------------
package com.baidu.Comparable;


import java.util.Iterator;
import java.util.TreeSet;


public class Test {
public static void main(String[] args){
TreeSet<Student> s=new TreeSet<Student>();
s.add(new Student("SDFGU",32));
s.add(new Student("WRTYU",23));
s.add(new Student("RTYUS",32));
s.add(new Student("WETWS",23));
s.add(new Student("SDFGU",32));
s.add(new Student("WRTYU",33));
s.add(new Student("QAWSER",32));
s.add(new Student("W3ERTYUI",23));
Iterator<Student> i=s.iterator();
while(i.hasNext()){
System.out.println(i.next());
}
}
}
Student类实现了Comparable接口中的compareTo()方法。在compareTo()方法中,首先对字符串长度进行比较,根据比较结果返回-1或1,或当长度相同时,再对name值进行比较,最后,对age进行比较。因此,可以看出学生首先按照name的长度排序,name的长度相同时会按照字母表的顺序,最后按照age排序。

  • package com.baidu.Comparable;


    public class Student implements Comparable<Student>{
    private String name;
    private int age;
    public Student(){
    super();
    }
    public Student (String name,int age){
    this.name=name;
    this.age=age;
    }
    public String getName(){
    return name;
    }
    public int getAge(){
    return age;
    }
    public String setName(String ename){
    this.name=ename;
    return name;
    }
    public int setAge(int ages){
    this.age=ages;
    return age;
    }
    @Override
    public int compareTo(Student o) {
    // TODO Auto-generated method stub
    return 0;
    }
    }
  • ------------------------------------------------------------------------
  • package com.baidu.compareTo;


    import java.util.Comparator;


    public class Test2 implements Comparator<Student>{


    public int compare(Student s, Student j) {
    // TODO Auto-generated method stub
    int num=s.getName().length()-j.getName().length();
    int num2=num==0?s.getName().compareTo(j.getName()):num;
    int num3=num2==0?s.getAge()-j.getAge():num2;
    return num3;
    }
    }
  • -----------------------------------------------------------------------
package com.baidu.compareTo;


import java.util.Iterator;
import java.util.TreeSet;


public class Test {
public static void main(String[] args){
TreeSet<Student> s=new TreeSet<student>(new Test2());
s.add(new Student("SDFGU",32));
s.add(new Student("WRTYU",23));
s.add(new Student("RTYUS",32));
s.add(new Student("WETWS",23));
s.add(new Student("SDFGU",32));
s.add(new Student("WRTYU",33));
s.add(new Student("QAWSER",32));
s.add(new Student("W3ERTYUI",23));

Iterator<Student> i=s.iterator();
while(i.hasNext()){
student stu = (Student)i.next();
System.out.println(stu.getName()+"----"+stu.getAge());

}

}

}

定义了一个Test2类实现了Comparator接口,在compare()方法中实现元素的比较,这相当于定义了一个比较器。在创建TreeSet集合时,将Test2比较器对象传入,当向集合添加元素时,比较器对象会自动调用compare()方法。

猜你喜欢

转载自blog.csdn.net/JIUTIANDEYING/article/details/80159259