Comparable接口和Comparator接口的不同用法

Posted 我不吃饼干呀

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Comparable接口和Comparator接口的不同用法相关的知识,希望对你有一定的参考价值。

两者都可用来在定义比较方法,然后用在排序中。

Comparable是类本身继承的接口

Comparator实在类外定义一个排序的类

比较而言,觉得Comparator更灵活一些,但是Comparable方便一些。

 

举个栗子:

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

public class Main {
    
    public static void main(String[] args) {
        ArrayList<Pair> list = new ArrayList<>();
        list.add(new Pair(8, 1));
        list.add(new Pair(6, 5));
        list.add(new Pair(6, 3));
        list.add(new Pair(5, 7));
        list.add(new Pair(4, 9));
        // 用Comparator排序 -- 按照两个数的和排序
        list.sort(new PairComparator());
        for (Pair p: list)
            System.out.println(p);
        System.out.println();
        // 用Comparable排序 -- 先按第一个数排序  再按第二个数排序
        Collections.sort(list);
        for (Pair p: list)
            System.out.println(p);
    }
}

class PairComparator implements Comparator<Pair> {

    @Override
    public int compare(Pair p1, Pair p2) {
        int sum1 = p1.getSum();
        int sum2 = p2.getSum();
        return (sum1 == sum2 ? 0 : (sum1 < sum2 ? -1 : 1));
    }
    
}

class Pair implements Comparable<Pair> {

    private int first;
    private int second;

    public Pair(int first, int second) {
        this.first = first;
        this.second = second;
    }

    @Override
    public int compareTo(Pair p) {
        if (first == p.first) {
            if (second == p.second) return 0;
            return second < p.second ? -1 : 1;
        }
        return first < p.first ? -1 : 1;
    }
    
    public int getSum() {
        return first + second;
    }
    
    public String toString() {
        return "[first:" + first + ", second:" + second + ", sum:" + getSum() + "]";
    }
    
}

输出:

[first:8, second:1, sum:9]
[first:6, second:3, sum:9]
[first:6, second:5, sum:11]
[first:5, second:7, sum:12]
[first:4, second:9, sum:13]

[first:4, second:9, sum:13]
[first:5, second:7, sum:12]
[first:6, second:3, sum:9]
[first:6, second:5, sum:11]
[first:8, second:1, sum:9]

 

对于一些已经写好的类,比如String,我们当然不能去修改它的compareTo()方法,于是可以写一个自定义的比较器。

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

public class Main {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("abcd");
        list.add("bcd");
        list.add("cd");
        list.add("d");
        Collections.sort(list);
        System.out.println(list);
        list.sort(new MyStringComparator());
        System.out.println(list);
    }
}

// 自定义的String排序方法  按字符串长度排序
class MyStringComparator implements Comparator<String> {

    @Override
    public int compare(String o1, String o2) {
        int len1 = o1.length();
        int len2 = o2.length();
        return (len1 == len2 ? 0 : (len1 < len2 ? -1 : 1));
    }
    
}

输出:

[abcd, bcd, cd, d]
[d, cd, bcd, abcd]

 

以上是关于Comparable接口和Comparator接口的不同用法的主要内容,如果未能解决你的问题,请参考以下文章

java Comparable 和 Comparator接口区别

Java中的Comparable接口和Comparator接口

Java中Comparable和Comparator接口区别分析

Comparable接口与Comparator接口的比较————总结

关于Comparable和Comparator那些事

比较接口:Comparable和Comparator