Java提高篇(5)-对象比较器
来源:互联网 发布:阿里云搭ss 编辑:程序博客网 时间:2024/06/10 04:07
在Java中要想对两个对象进行比较大小,需要实现Comparable接口或Comparator接口。String类型的值之所以可以比较大小(汉字根据ANSI值的大小进行比较),是因为String类实现了Comparable<T>接口。如果要比较的对象没有实现Comparable接口或Comparator接口而直接比较会报 java.lang.ClassCastException类型转换异常。
两个对象进行比较方法一:实现Comparable<T>接口
Person类是要比较的对象
- package com.lym.comparator;
-
-
-
-
-
-
- public class Person implements Comparable<Person>{
-
- 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 + "]";
- }
-
-
- @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;
- }
-
- }
方法二:实现Comparator<T>接口实现Comparator<T>接口与Comparable<T>接口有什么区别吗?
答:Comparable<T>接口 是在要比较的对象类创建的时候就实现了,也就是在项目上线之前就设计好了,大多数时候是采用这种方法。但是,有的时候项目已经上线了,此时我们还要对某个类进行比较,而此时该类还没有实现Comparable<T>接口,为了遵守软件开发中“对扩展开放,对修改关闭”的原则,我们可以再定义一个比较器类,实现Comparator<T>接口,这样我们就不会破坏要比较的类的原有结构了。
自定义比较器类
- package com.lym.comparator;
-
- import java.util.Comparator;
-
-
-
-
-
-
-
- public class ComparatorDemo 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;
- }
-
- }
Person2类
- package com.lym.comparator;
-
-
-
-
-
-
-
- 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;
-
-
-
-
-
-
- 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));
-
-
- Arrays.sort(persons);
- System.out.println(Arrays.toString(persons));
-
-
- Arrays.sort(persons2);
- System.out.println(Arrays.toString(persons2));
- }
-
- }