码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2017-03-13 11:37:06      阅读:207      评论:0      收藏:0      [点我收藏+]

标签:方法   main   style   方便   his   oid   java   static   second   

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

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接口的不同用法

标签:方法   main   style   方便   his   oid   java   static   second   

原文地址:http://www.cnblogs.com/wenruo/p/6541715.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!