Comparable和Comparator的区别

1. Comparable 接口

是一个“内比较器”,里面就一个接口public int compareTo(T o);实现了Comparable接口的类有一个特点,就是这些类是可以和自己比较的,至于具体和另一个实现了Comparable接口的类如何比较,则依赖compareTo方法的实现,compareTo方法也被称为自然比较方法。如果开发者add进入一个Collection的对象想要Collections的sort方法帮你自动进行排序的话,那么这个对象必须实现Comparable接口。compareTo方法的返回值是int,有三种排序方式:

  • 升序(this.o > o; return 1;)

  • 降序(this.o < o; return -1;)

  • 默认数组顺序 (this.o == o; return 0;)

1.1 代码

public class Book implements Comparable<Book>{

    private String name;
    private int price;

    public Book(String name,int price){
        this.name=name;
        this.price=price;
    }

    get set 
    ....

    @Override
    public String toString() {
        return "Book [name=" + name + ", price=" + price + "]";
    }



    @Override
    public int compareTo(Book o) {
        if(this.price>o.getPrice()) {
            return 1;//升序
        }else if(this.price<o.getPrice()){
            return -1;//降序
        }
        return 0;//正常排序
    }

    public static void main (String arg[]) {
        Book list[]= {
        new Book("java",10),
        new Book("C#",20),
        new Book("C++",30),
        new Book("CSS",11)};
        System.out.println("排序前:");
        for(Book b:list) {
            System.out.println(b.getName()+"\t\t"+b.getPrice());
        }
        Arrays.sort(list);
        System.out.println();
        System.out.println("排序后:");
        for(Book b:list) {
            System.out.println(b.getName()+"\t\t"+b.getPrice());
        }
    }

}
排序前:排序前:排序后:排序后:
java10java10
C#20CSS11
C++30C#20
CSS11C++30

2. Comparator 接口

Comparator可以认为是是一个“外比较器”,个人认为有三种情况可以使用实现Comparator接口的方式:

  • 一个对象不支持自己和自己比较(没有实现Comparable接口),但是又想对两个对象进行比较

  • 一个对象实现了Comparable接口,但是开发者认为compareTo方法中的比较方式并不是自己想要的那种比较方式

  • 一个Integer数组需要降序时,这时候就需要Comparator定制接口了,因为Integer默认实现了Comparable并且是排序为自然排序

Comparator接口里面有一个compare方法,方法有两个参数T o1和T o2,是泛型的表示方式,分别表示待比较的两个对象,方法返回值和Comparable接口一样是int,有三种排序方式:

  • 升序(o1 > o2; return 1;)

  • 降序(o1 < o2; return -1;)

  • 默认数组顺序 (o1 == o2; return 0;)

2.1代码


public class Comparators<T> implements Comparator<T>{

    @Override
    public int compare(T o1, T o2) {
        if(o1 instanceof Integer && o2 instanceof Integer) {
            Integer int1=(Integer)o1; 
            Integer int2=(Integer)o2;
            if(int2>int1) {
                return 1;
            }else if(int2<int1) {
                return -1;
            }
        }
        return 0;
    }


    public static void main (String arg[]) {
        Integer it[]= {1,24,4,12,45,134,64,2};
        System.out.println("排序前:");
        System.out.println(Arrays.toString(it));
        Arrays.sort(it);
        System.out.println("自然排序:");
        System.out.println(Arrays.toString(it));
        Arrays.asList(it);
        System.out.println("降序后:");
        Arrays.sort(it, new Comparators<Integer>());
        System.out.println(Arrays.toString(it));
    }

}

排序前:自然排序:降序后:
[1, 24, 4, 12, 45, 134, 64, 2][1, 2, 4, 12, 24, 45, 64, 134][134, 64, 45, 24, 12, 4, 2, 1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值