在Java中要想对两个对象进行比较大小,需要实现Comparable接口或Comparator接口。String类型的值之所以可以比较大小(汉字根据ANSI值的大小进行比较),是因为String类实现了Comparable接口。如果要比较的对象没有实现Comparable接口或Comparator接口而直接比较会报 java.lang.ClassCastException类型转换异常。
两个对象进行比较方法一:实现Comparable接口
Person类是要比较的对象
package com.lym.comparator;
/**
* 人类
* 要使该类能进行比较,该类必须实现Comparable接口
* @author Administrator
*
*/
public class Person implements Comparable{
private String name;
private int age;
public Person() {
super();
}
public Person(String name, int age) {
super();
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和-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;
}else if(this.age=o.age){return 0;
}}
方法二:实现Comparator接口实现Comparator接口与Comparable接口有什么区别吗?
答:Comparable接口 是在要比较的对象类创建的时候就实现了,也就是在项目上线之前就设计好了,大多数时候是采用这种方法。但是,有的时候项目已经上线了,此时我们还要对某个类进行比较,而此时该类还没有实现Comparable接口,为了遵守软件开发中“对扩展开放,对修改关闭”的原则,我们可以再定义一个比较器类,实现Comparator接口,这样我们就不会破坏要比较的类的原有结构了。自定义比较器类
package com.lym.comparator;
import java.util.Comparator;
/**
* 自定义比较器类
*
* @author Administrator
*
*/
public class ComparatorDemo implements Comparator {
@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;
}
}
Person2类package com.lym.comparator;
/**
* 人类
*
* @author Administrator
*
*/
public class Person2 {
private String name;
private int age;
public Person2() {
super();
}
public Person2(String name, int age) {
super();
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 "Person2 [name=" + name + ", age=" + age + "]";
}
}
对象比较器测试类package com.lym.comparator;
import java.util.Arrays;
/**
* 对象比较器测试类
* @author Administrator
*
*/
public class ComparableDemo {
public static void main(String[] args) {
String[] names = {"利亚","藤兰","泉彩","井空","岛爱","结衣"};
Person[] persons = {
new Person("泉彩",23),new Person("岛爱",25),
new Person("藤兰",41),new Person("结衣",35),
new Person("利亚",28),new Person("井空",32)
};
Person2[] persons2 = {
new Person2("泉彩",23),new Person2("岛爱",25),
new Person2("藤兰",41),new Person2("结衣",35),
new Person2("利亚",28),new Person2("井空",32)
};
Arrays.sort(names);
System.out.println(Arrays.toString(names));
//实现Comparable接口
Arrays.sort(persons);//按Person对象的age属性比较大小
System.out.println(Arrays.toString(persons));//输出比较后的对象数组
//自定义比较器,实现Comparator接口
Arrays.sort(persons2);
System.out.println(Arrays.toString(persons2));
}
}