Comparable与Comparator都可以对引用类型进行比较,它们的使用方式不同
Comparable使用:需要进行比较的引用类实现这个接口,重写Comparable中的compareTo方法
public class Employee{
private String name;
private int age;
private double sal;
@Override
public int compareTo(Object o){ //重写compareTo方法,规定按照年龄升序排序
if(o instance Employee){
Employee e = (Employee)o;
if(this.age >e.age){
return 1;
}else if(this.age == e.age){
return 0;
}else if(this.age < e.age){
return -1;
}
}
return 0;
}
}
//main方法
public static void main(String [] args){
Employee [] employees = {employee1,employee2,employee3};
System.out.println(Arrays.sort(employees));
}
Comparator使用:Comparator也是接口,但它的使用 通过匿名内部类的方式重写compare方法:int compare(T o1,T o2);
当o1>o2时,返回1(或者说一个大于0 的数),o1 == o2 时返回0,o1<o2 时 返回-1,此时默认升序排列对象;
当o1>o2时,返回-1(或者说一个大于0 的数),o1 == o2 时返回0,o1<o2 时 返回1,此时默认降序排列对象;
demo:
public class Employee{
private String name;
private int age;
private double sal;
...
}
public Employee[] sortDesc(Employee[] employees){
Comparator<Employee> com=new Comparator<Employee>(){
@Override
public int compare(Employee o1,Employee o2){ //规定按照工资降序
if(o1.getSal()<o2.getSal()){
return 1;
}else if(o1.getSal()>o2.getSal()){
return -1;
}
return 0;
}
};
Arrays.sort(employees,com);//在这里直接调用sort方法
return employees;
}
练习:
public class Test01 {
public static void main(String[] args) {
//1)定义TreeSet存储String字符串, 在构造方法中指定Comparator比较器,根据字符串降序排序
TreeSet<String > treeSet = new TreeSet<>(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o2.compareTo(o1);
}
});
treeSet.add("gg");
treeSet.add("kk");
treeSet.add("mm");
treeSet.add("xx");
System.out.println( treeSet ); //[xx, mm, kk, gg]