Java之面向对象,比较器

这篇博客详细介绍了Java中的Comparable和Comparator接口。Comparable用于类的内部排序,实现Comparable接口可以直接对对象进行比较。Comparator则作为外部比较器,允许在不修改原有类的情况下控制排序规则。文中给出了两个示例,分别展示了Comparable接口和Comparator接口的用法,通过Arrays.sort方法进行排序,结果一致。
摘要由CSDN通过智能技术生成

比较器

比较有Comparator 和 Comparable

Comparable

Comparable是排序接口;若一个类实现了Comparable接口,就意味着“该类支持排序”。这个是直接作用于实体类上的

Comparator

Comparator是比较器;我们若需要控制某个类的次序,可以建立一个“该类的比较器”来进行排序。作用于一个排序类上

Comparable举例:

// 声明一个类并连接Comparable比较接口
public class Incom implements Comparable<Incom> {
    private String name;
    private int num;
    public Incom(String name, int num) {//有参构造
        this.name = name;
        this.num = num;
    }
    @Override//重写toString方法
    public String toString() {
        return "Incom{" +
                "name='" + name + '\'' +
                ", num=" + num +
                '}';
    }
    @Override//对于Comparable接口的方法进行重写,相当于比较规则
    public int compareTo(Incom o) {
        return this.num-o.getNum();
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getNum() {
        return num;
    }
    public void setNum(int num) {
        this.num = num;
    }
}
// 测试类中进行测试
public class Testin {
    public static void main(String[] args) {
        Incom i1 = new Incom("张三", 21);
        Incom i2 = new Incom("李四", 25);
        Incom i3 = new Incom("王五", 23);
        Incom[] in = {i1,i2,i3};
        Arrays.sort(in);//使用Arrays的方法进行比较,使用的是在之前类中对于Comparable接口重写的比较规则
        System.out.println(Arrays.toString(in));
    }
}

所得结果:
在这里插入图片描述
Comparator的举例

// 先写一个类
public class Out {
    private String name;
    private int num;
    public Out(String name, int num) {
        this.name = name;
        this.num = num;
    }
    @Override
    public String toString() {
        return "Incom{" +
                "name='" + name + '\'' +
                ", num=" + num +
                '}';
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getNum() {
        return num;
    }
    public void setNum(int num) {
        this.num = num;
    }
}

使用Comparator

// 再在另外的类中接入Comparator并重写方法
public class Outcom implements Comparator<Out> {
    @Override
    public int compare(Out o1, Out o2) {
        return o1.getNum()-o2.getNum();
    }
}

使用测试类进行测试

// 使用测试类进行测试
public class Testout {
    public static void main(String[] args) {
        Out i1 = new Out("张三", 21);
        Out i2 = new Out("李四", 25);
        Out i3 = new Out("王五", 23);
        Out[] outs = {i1,i2,i3};
        Arrays.sort(outs,new Outcom());//使用Arrays方法时要加上写好的比较规则
        System.out.println(Arrays.toString(outs));
    }
}

结果不变:
在这里插入图片描述

总结:

Comparable相当于“内部比较器”,而Comparator相当于“外部比较器”。

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、付费专栏及课程。

余额充值