这篇博客主要是总结java中对象比较器的相关用法。
1.比较器的作用
对两个或多个数据项进行比较,以确定它们是否相等,或确定他们之间的大小关系以及排列顺序称为比较
2.Comparable接口
自定义对象的比较一定要实现Comparable接口,否则会产生java.lang.ClassCastException异常
此接口强行对实现它的每个类的对象进行整体的排序。这种排序被称为类的自然排序,类的compareTo方法称为自然比较方法
public interface Comparable<T>
{
int compareTo(T o)//o是要比较的对象
//比较对象与指定对象的顺序
}
分别返回-1、0或者1中的一个值根据此判别对象是小于、等于还是大于
指定对象
自定义Person类并实现了Comparable接口
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 "name="+name+"age="+age;
}
//比较器的比较方法
@Override
public int compareTo(Person o) {
//实现:定义对象之间的比较方法
//如果当前对象小于参数对象,返回-1
//如果当前对象等于参数对象,返回0
//如果当前对象大于参数对象,返回1
if(o==null)
{
throw new NullPointerException();
}
if(this.age<o.age)
{
return -1;
}
else if(this.age>o.age)
{
return 1;
}
return 0;
}
}
实现对对象的排序
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)
};
Personal [] persons1={new Personal("利亚",27),new Personal("泉彩",29),
new Personal("岛爱",41),new Personal("藤兰",33),
new Personal("结衣",25),new Personal("井空",30)
};
Arrays.sort(names);
System.out.println(Arrays.toString(names));
//自定义类对象数组,由于实现了Comparable接口,并重写
//了compareTo方法,所以这里的sort方法可以实现按照指定的属性排序
Arrays.sort(persons);
//对象数组,所以要事先重写对象的toString()方法
System.out.println(Arrays.toString(persons));
}
}
3.Comparator接口
Comparable接口是要求自定义类去实现按照OO原则,对修改关闭,对拓展开放那么如果这个类已经定义好了,不想再去修改它,那如何实现比较呢?
Array.sort有一个这样的重载方法:
public static void sort(T[]a,Comparator
public class Personal {
private String name;
private int age;
public Personal()
{
}
public Personal(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 "name:"+name+",age:"+age;
}
}
//自定义类的比较器,对代码进行拓展
public class PersonalComparatorDemo implements Comparator<Personal>{
@Override
public int compare(Personal o1, Personal 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;
}
}
//使用自定义的类比较器比较
public class PersonSortDemo {
public static void main(String args[])
{
Personal [] persons1={new Personal("利亚",27),new Personal("泉彩",29),
new Personal("岛爱",41),new Personal("藤兰",33),
new Personal("结衣",25),new Personal("井空",30)
};
//使用自定义的比较器
//第一个参数为要进行排序的类,第二个参数为自定义的比较器的对象
Arrays.sort(persons1,new PersonalComparatorDemo());
System.out.println(Arrays.toString(persons1));
}
}