java的比较器
1. 三种方式
1、覆写Object类的equals()方法;
2、继承Comparable接口,并实现compareTo()方法;
3、定义一个单独的对象比较器,继承自Comparator接口,实现compare()方法。
1.1 实现 compareable 接口
将需要比较的类实现 compareable接口,并重写 int compareTo(T obj)方法,这个是用来指定,该类的比较规则是什么,如何比较大小的。
public class Compare implements Comparable<Compare> {
//年龄比较器
private int age;
public Compare(int age) {
this.age = age;
}
public int compareTo(Compare compare) { //重写方法
System.out.println("this is sort");
return compare.age-this.age; //更改 规则可以改变 升序降序
}
@Override
public String toString() {
return "Comparator{" +
"age=" + age +
'}';
}
}
测试
public class App {
public static void main(String[] args) {
Compare[] users=new Compare[]{
new Compare(25),
new Compare(23),
new Compare(24),
new Compare(21)
};
System.out.println("排序前");
for(Compare item:users){
System.out.println(item);
}
Arrays.sort(users); //用比较器 排序
System.out.println("排序后");
for(Compare item:users){
System.out.println(item);
}
}
}
结果
实现 Comparator 接口
相当于定义了一个 比较器 ,当数组比较时,需要指定 自己定义的比较器
实现接口,自定义一个比较器
public class Compare implements Comparator<Integer> { //传入的比较对象的类型
private int age;
public int compare(Integer o1, Integer o2) { //重写方法
return o1 - o2; //规则
}
}
测试
public class App{
public static void main(String[] args) {
Integer [] nums=new Integer[]{6,3,7,1,0,8,10,2,5};
System.out.println("排序之前");
for (int item:nums){
System.out.println(item);
}
Arrays.sort(nums,new Compare()); //调用比较器 排序
System.out.println("排序之后");
for(int item:nums){
System.out.println(item);
}
}
}
结果
总结
- Comparable接口将比较代码嵌入自身类中,而Comparator 在一个独立的类中实现比较。
- Comparable 不需要指定比较器,会自己调用
- Comparator 需要指定 自己定义的比较器 如:
Arrays.sort(nums,new Compare());