1.比较器的作用
对两个或多个数据想进行比较,以确定它们是否相等,或确定它们之间的大小关系及排列顺序称为比较。
前面我们学习过Arrays.sort方法可实现对象的排序操作:
public static void sort(Object[] a)
2.Comparable接口
此接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的compareTo方法被称为它的自然比较方法。
public interface Comparable<T>{
int compareTo(T o);//o是要比较的对象
//比较次对象与指定对象的顺序
}
分别返回-1、0或1中的一个值
根据次对象时小于、等于还是大于指定对象。
3.Comparator接口
Comparable接口是要求自己一定类去实现,按照OO原则:对修改关闭,对扩展开放。
那么如果这个类已经定义好了,不想在去修改它,那如何实现比较呢?
Arrays.sort有一个这样的重载方法:
public static<T>void sort(T[] a,Comparator<?super T>c)
Comparator接口:强行对某个对象collection进行整体排序的比较。
int compare(T o1,T o2) //比较用来排序的两个参数。
根据第一个参数小于、等于或大于第二个参数分别返回负整数、零或正整数。
package com.vince.sort;
/**
* 人类
* 如果自定义类的对象要实现排序(比较),那么就要实现Comparable接口,并实现接口的
* compareTo方法
* @author lamp
*
*/
public class Person implements Comparable<Person>{
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
//比较器的比较方法
//如果当前对象小于参数对象,返回-1
//如果当前对象等于参数对象,返回0
//如果当前对象大于参数对象,返回1
@Override
public int compareTo(Person o) {
//实现:定义对象之间的比较规则
if(o==null){
throw new NullPointerException();
}
if(this.age<o.age){
return -1;
}else if(this.age>o.age){
return 1;
}
return 0;
}
}
package com.vince.sort;
import java.util.Arrays;
//对象的排序
public class PersonSortDemo {
public static void main(String[] args) {
String[] names = {"利亚","泉彩","岛爱","藤兰","结衣","井空"};
Person[] persons = {
new Person("利亚", 27), new Person("泉彩", 29),
new Person("岛爱", 41), new Person("藤兰", 33),
new Person("结衣", 25), new Person("井空", 30) };
Person2[] persons2 = {
new Person2("利亚", 27), new Person2("泉彩", 29),
new Person2("岛爱", 41), new Person2("藤兰", 33),
new Person2("结衣", 25), new Person2("井空", 30) };
Arrays.sort(names);
System.out.println(Arrays.toString(names));
//自定义类对象数组排序
Arrays.sort(persons);
System.out.println(Arrays.toString(persons));
//使用自定义的比较器
Arrays.sort(persons2, new Person2Comparator());
System.out.println(Arrays.toString(persons2));
}
}
package com.vince.sort;
/**
* 人类
* @author lamp
*
*/
public class Person2{
private String name;
private int age;
public Person2() {
}
public Person2(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
}
package com.vince.sort;
import java.util.Comparator;
/**
* 自定义的类比较器
* @author lamp
*
*/
public class Person2Comparator implements Comparator<Person2>{
@Override
public int compare(Person2 o1, Person2 o2) {
if(o1==null || o2==null){
throw new NullPointerException();
}
if(o1.getAge()<o2.getAge()){
return -1;
}else if(o1.getAge()>o2.getAge()){
return 1;
}
return 0;
}
}