——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-
比较器概述:
如果一个数组里放的是一组对象,那么就会有怎么把这些对象进行排序的问题,往容器TreeSet里面添加对象时,必须要求这些对象时能够进行比较的,这里也会有对象的排序问题。我们在对对象进行排序的时候,就会用到比较器。常用的比较器有两种,Comparable和Comparator。
Comparable和Comparator都是接口。一组对象要想进行排序,该对象所属的类就必须实现两个接口。一般来说,我们首选Comparable方法,具体的比较方法如下。用Comparable比较器实现排序
首先,创建一组需要比较的对象的类,并让该类实现Comparable接口,以Employee类为例:
public class Employee implements Comparable{
private String name;
private int age;
public Employee(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
@Override
public String toString() {
return "Employee [name=" + name + ", age=" + age + "]";
}
@Override
public int compareTo(Object o) {
if(o instanceof Employee){
Employee e = (Employee) o;
return this.getAge() - e.getAge();
}
return 0;
}
}
- 这个类创建好后,可以再创建一个TreeSet容器,也可以是数组,这里就以TreeSet容器为例,来进行对象的排序。代码如下:
public class testTree {
public static void main(String[] args) {
testTreeSet();
}
public static void testTreeSet(){
Employee e1 = new Employee("liudehua",20); //创建Employee对象
Employee e2 = new Employee("zhangxueyou",22);
Employee e3 = new Employee("liming",26);
Employee e4 = new Employee("chenxujie",29);
Employee e5 = new Employee("zhangsan",25);
TreeSet ts = new TreeSet(); //创建一个TreeSet容器
ts.add(e1); //往容器里添加对象
ts.add(e2);
ts.add(e3);
ts.add(e4);
ts.add(e5);
Iterator it = ts.iterator(); //创建一个迭代器来遍历对象
while(it.hasNext()){
System.out.println(it.next());
}
}
}
程序运行后可以得到如下结果,按年龄进行了排序:
Employee [name=liudehua, age=20]
Employee [name=zhangxueyou, age=22]
Employee [name=zhangsan, age=25]
Employee [name=liming, age=26]
Employee [name=chenxujie, age=29]
Comparable比较器一般用在一个类提前实现了该接口的情况下使用,现在有个问题是,我在设计一个类的时候没考虑到将来要对该类的对象进行排序,一段时间之后,要对这一组对象进行排序,这个时候再去修改Employee类就不合适了,这个时候,就可以用到Comparator比较器了。使用如下:
public class Employee {
private String name;
private int age;
public String getName() {
return name;
}
public int getAge() {
return age;
}
@Override
public String toString() {
return "Employee [name=" + name + ", age=" + age + "]";
}
public Employee(String name, int age) {
super();
this.name = name;
this.age = age;
}
}
public class testTree {
public static void main(String[] args) {
testTreeSet();
}
public static void testTreeSet(){
Employee e1 = new Employee("liudehua",20); //创建Employee对象
Employee e2 = new Employee("zhangxueyou",22);
Employee e3 = new Employee("liming",26);
Employee e4 = new Employee("chenxujie",29);
Employee e5 = new Employee("zhangsan",25);
EmployeeComparator ec = new EmployeeComparator(); //创建一个比较器ec,
TreeSet ts = new TreeSet(ec); //创建一个TreeSet容器,并往里传入比较器ec,
ts.add(e1); //往容器里添加对象
ts.add(e2);
ts.add(e3);
ts.add(e4);
ts.add(e5);
Iterator it = ts.iterator(); //创建一个迭代器来遍历对象
while(it.hasNext()){
System.out.println(it.next());
}
}
}
class EmployeeComparator implements Comparator{
@Override
public int compare(Object o1, Object o2) {
if(o1 instanceof Employee && o2 instanceof Employee){
Employee e1 = (Employee) o1;
Employee e2 = (Employee) o2;
int i = e1.getAge() - e2.getAge();
if(i == 0){
return e1.getName().compareTo(e2.getName());
}
return i;
}
return 0;
}
}
运行程序后,将得到如下结果:
Employee [name=liudehua, age=20]
Employee [name=zhangxueyou, age=22]
Employee [name=zhangsan, age=25]
Employee [name=liming, age=26]
Employee [name=chenxujie, age=29]
以上两种方式就是对对象进行排序的方法,一般来说,我们首选Comparable比较器,但如果遇到第二种情况,就选择第二种方法。可以根据自己的需要来选择使用以上两种方法。