今天在打代码的时候,我犯了一个错误,我把Comparator当成了Comparable,所以为了以后大家不要犯和我一样的错误,我发表了一篇博客,给大家介绍一下Comparable与Comparator区别。
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 + "]";
}
} - ----------------------------------------------------------------
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;
}
} - -----------------------------------------------------------------------
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()方法。