Java复习之对象比较器

这篇博客主要是总结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));
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
public class Comparators { public static java.util.Comparator getComparator() { return new java.util.Comparator() { public int compare(Object o1, Object o2) { if (o1 instanceof String) { return compare( (String) o1, (String) o2); } else if (o1 instanceof Integer) { return compare( (Integer) o1, (Integer) o2); } else if (o1 instanceof Person) { return compare( (Person) o1, (Person) o2); } else { System.err.println("未找到合适的比较器"); return 1; } } public int compare(String o1, String o2) { String s1 = (String) o1; String s2 = (String) o2; int len1 = s1.length(); int len2 = s2.length(); int n = Math.min(len1, len2); char v1[] = s1.toCharArray(); char v2[] = s2.toCharArray(); int pos = 0; while (n-- != 0) { char c1 = v1[pos]; char c2 = v2[pos]; if (c1 != c2) { return c1 - c2; } pos++; } return len1 - len2; } public int compare(Integer o1, Integer o2) { int val1 = o1.intValue(); int val2 = o2.intValue(); return (val1 < val2 ? -1 : (val1 == val2 ? 0 : 1)); } public int compare(Boolean o1, Boolean o2) { return (o1.equals(o2)? 0 : (o1.booleanValue()==true?1:-1)); } public int compare(Person o1, Person o2) { String firstname1 = o1.getFirstName(); String firstname2 = o2.getFirstName(); String lastname1 = o1.getLastName(); String lastname2 = o2.getLastName(); Boolean sex1 = o1.getSex(); Boolean sex2 = o2.getSex(); Integer age1 = o1.getAge(); Integer age2 = o2.getAge(); return (compare(firstname1, firstname2) == 0 ? (compare(lastname1, lastname2) == 0 ? (compare(sex1, sex2) == 0 ? (compare(age1, age2) == 0 ? 0 : compare(age1, age2)) : compare(sex1, sex2)) : compare(lastname1, lastname2)) : compare(firstname1, firstname2)); } }; } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值