Java(28)java比较器
JAVA比较器
java的比较器主要分为两种,第一种是实现Comparable接口的内部比较器,第二种是实现Comparator接口的外部比较器。
Comparabel接口的部分源码如下:
public interface Comparable<T> {
public int compareTo(T o);
}
Comparator接口的部分源码如下:
public interface Comparator<T> {
int compare(T o1, T o2);
}
内部比较器--Comparable接口
Comparable
接口位于java.lang
包下。
当需要对某个类(可以是自己定义的)的对象进行排序时候,则需要实现Comparable
这个接口,然后重写compareTo
方法。我们的类实现这个接口和重写方法后,就可以使用Array.sort()
对这个类的实例对象数组进行排序,或者使用Collection.sort
对这个类的对象List集合进行排序。我们需要在compareTo
方法里定义我们的排序规则。注意:自定义类的时候最好重写顶级父类Object
的toString()
方法。
案例1:内部比较器
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
public class Employee implements Comparable<Employee> { //这里记得要指定泛型
private String name;
private int id;
private long salary;
public Employee(String name, int id, long salary) {
this.name = name;
this.id = id;
this.salary = salary;
}
@Override
public int compareTo(Employee o) {
if (this.salary > o.salary) {
return (1);
} else if (this.salary < o.salary) {
return (-1);
} else {
return (0);
}
}
//默认的toString()方法,调用顶级父类Object的toString()方法
// @Override
// public String toString() {
// return super.toString();
// }
//super.toString(),父类Object的toString源码如下,该方法默认返回类名和hashCode相关信息
// public String toString() {
// return getClass().getName() + "@" + Integer.toHexString(hashCode());
// }
//重写toString()方法
@Override
public String toString() {
return (this.name+"\t"+this.id+"\t"+this.salary);
}
}
class RunClass {
public static void main(String[] args) {
Employee[] ems = {
new Employee("zhansan", 23522, 20000),
new Employee("lisi", 23436, 24000),
new Employee("laowang", 235634, 10000)
};
System.out.println("===============使用Arrays.sort()来进行排序");
//排序前
for(Employee e:ems){
System.out.println(e.toString());
}
Arrays.sort(ems);
System.out.println("==============");
//排序后
for(Employee e:ems){
System.out.println(e.toString());
}
System.out.println("===============使用Arrays.sort()来进行排序");
List<Employee> myList=new ArrayList<Employee>();
myList.add(new Employee("zhansan", 23522, 20000));
myList.add(new Employee("lisi", 23436, 24000));
myList.add(new Employee("lisi", 23436, 24000));
//排序前
for(Employee e:ems){
System.out.println(e.toString());
}
Collections.sort(myList);
System.out.println("==============");
//排序后
for(Employee e:ems){
System.out.println(e.toString());
}
}
}
运行输出结果如下:
===============使用Arrays.sort()来进行排序
zhansan 23522 20000
lisi 23436 24000
laowang 235634 10000
==============
laowang 235634 10000
zhansan 23522 20000
lisi 23436 24000
===============使用Arrays.sort()来进行排序
laowang 235634 10000
zhansan 23522 20000
lisi 23436 24000
==============
laowang 235634 10000
zhansan 23522 20000
lisi 23436 24000
外部比较器--Comparator接口
Comparator
接口位于java.util
包下。
Comparator
接口是一个跟Comparable
接口功能很相近的比较器。比较大的区别是,实现该接口的类一般是一个独立的类。详情看代码:
import java.util.*;
class Employee{
private String name;
private int age;
private long salary;
public Employee(String name,int age,long salary){
this.salary=salary;
this.name=name;
this.age=age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public long getSalary() {
return salary;
}
@Override
public String toString() {
return this.name+"\t"+this.age+"\t"+this.salary;
}
}
//创建年龄比较器:
class AgeComparator implements Comparator<Employee>{
@Override
public int compare(Employee o1, Employee o2) {
if (o1.getAge()>o2.getAge()){
return 1;
}else if(o1.getAge()<o2.getAge()){
return -1;
}else {
return 0;
}
}
}
//创建薪水比较器:
class SalaryComparator implements Comparator<Employee>{
@Override
public int compare(Employee o1, Employee o2) {
if (o1.getSalary() > o2.getSalary()) {
return 1;
} else if (o1.getSalary() < o2.getSalary()) {
return -1;
} else {
return 0;
}
}
}
class RunClass {
public static void main(String[] args) {
Employee[] ems = {
new Employee("zhansan", 26, 30000),
new Employee("lisi",14, 24000),
new Employee("laowang",40, 10000)
};
System.out.println("===============使用薪水比较器来进行排序");
//排序前
for(Employee e:ems){
System.out.println(e.toString());
}
Arrays.sort(ems,new SalaryComparator()); //使用薪水比较器进行排序
System.out.println("==============");
//排序后
for(Employee e:ems){
System.out.println(e.toString());
}
System.out.println("===============使用年龄比较器来进行排序");
List<Employee> myList=new ArrayList<Employee>();
myList.add(new Employee("zhansan", 23522, 20000));
myList.add(new Employee("lisi", 23436, 24000));
myList.add(new Employee("lisi", 23436, 24000));
//排序前
for(Employee e:ems){
System.out.println(e.toString());
}
Collections.sort(myList,new AgeComparator()); //使用年龄比较器进行排序
System.out.println("==============");
//排序后
for(Employee e:ems){
System.out.println(e.toString());
}
}
}
运行输出结果如下:
===============使用薪水比较器来进行排序
zhansan 26 30000
lisi 14 24000
laowang 40 10000
==============
laowang 40 10000
lisi 14 24000
zhansan 26 30000
===============使用年龄比较器来进行排序
laowang 40 10000
lisi 14 24000
zhansan 26 30000
==============
laowang 40 10000
lisi 14 24000
zhansan 26 30000
内部与外部比较器的区别
如果定义一个类的时候,没有考虑到排序的问题,即没有实现Comparable
接口,那么就可以通过实现Comparator
接口来来进行自定义排序。Comparator
可以方便使用不同的排序规则,更加灵活一点。