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]
时间: 2024-08-03 19:30:15

Comparable接口和Comparator接口的不同用法的相关文章

Java—集合框架 Collections.sort()、Comparable接口和Comparator接口

Collentions工具类--java.util.Collections Collentions是Java集合框架中,用来操作集合对象的工具类,也是Java集合框架的成员,与List.Map和Set是并列的. Collections.sort() 排序方法,实现对List对象中的元素进行排序. package com.test.collection; import java.util.ArrayList; import java.util.Collections; import java.ut

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

之前的两篇文章主要学习了Comparable接口和Comparator接口的学习.既然已经学习完了,现在就趁热打铁,进行总结吧! Comparable接口和Comparator接口的共同点: 1. 都是为了进行排序.(废话,当然都是进行排序了!!!嘿嘿,大家都能看出来,不过还是写下来了!) 2. 都是接口.(额..又是废话) 除此之外,小编想不出还有什么共同点了!想到了其他的相同点可以在文章下方留言,大家一起学习! 相同点说完了,接下来就是不同点啦. Comparable接口与Comparato

Java6.0中Comparable接口与Comparator接口详解

Java6.0中Comparable接口与Comparator接口详解 说到现在,读者应该对Comparable接口有了大概的了解,但是为什么又要有一个Comparator接口呢?难道Java的开发者都吃饱撑着没事做吗? 再谈Comparator接口之前,大家应该先了解一个叫“策略模式”的东东.一下是百度百科对策略模式的描写: 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它的客户而独立变化.(原文:The Strategy Pattern

java中的排序Comparable接口和Comparator接口

普通的类要实现排序,必须实现Comparable接口,并重写CompareTo()方法. package test; public class Field implements Comparable<Field> {     private String name;     private int age;     public Field() {     }     public Field(String name, int age) {         this.name = name;

Comparable接口和Comparator接口

这两个接口经常容易混淆,不用的时候不清楚,用的时候就很容易出错,现摘抄网络上的一篇清楚的文章在此,便于日后查阅. 在实际应用中,我们往往有需要比较两个自定义对象大小的地方.而这些自定义对象的比较,就不像简单的整型数据那么简单,它们往往包含有许多的属性,我们一般都是根据这些属性对自定义对象进行比较的.所以Java中要比较对象的大小或者要对对象的集合进行排序,需要通过比较这些对象的某些属性的大小来确定它们之间的大小关系. 一般,Java中通过接口实现两个对象的比较,比较常用就是Comparable接

比较器:Compare接口与Comparator接口区别与理解

一.实现Compare接口与Comparator接口的类,都是为了对象实例数组排序的方便,因为可以直接调用 java.util.Arrays.sort(对象数组名称),可以自定义排序规则. 不同之处: 1 排序规则实现的方法不同 Comparable接口的方法:compareTo(Object o) Comparator接口的方法:compare(T o1, To2) 2 类设计前后不同 Comparable接口用于在类的设计中使用: Comparator接口用于类设计已经完成,还想排序(Arr

Java之Comparable接口和Comparator接口

Comparable & Comparator 都是用来实现集合中元素的比较.排序的: Comparable 是在集合内部定义的方法实现的排序: Comparator 是在集合外部实现的排序: 所以,如想实现排序,就需要在集合外定义 Comparator 接口的方法或在集合内实现 Comparable 接口的方法. Comparator位于包java.util下,而Comparable位于包java.lang下 Comparable 是一个对象本身就已经支持自比较所需要实现的接口(如 Strin

Comparable接口与Comparator接口的比较————Comparator接口详解

Comparator接口位于:java.util包中. Comparator接口:1. 强行对某个对象的Collection进行整体排序.值得注意的是:Comparator接口可以作为参数传到一些sort()方法中,例如:Collection.sort(List<T> list, Comparator<? super T> c).Arrays.sort(T[] a, Comparator<? super T> c); 2. Comparator接口指定的顺序,可以不是字

Java中的Comparator接口和Comparator接口

Comparator位于包java.util下,比较器,是在集合外部定义排序.Comparable位于包java.lang下,代表当前对象可比较的,是在集合内部实现排序. Comparable代表一个对象内部支持排序(比如String类,Integer类,内部实现了Comparable接口) Collections.sort(list<T>)中,T必须实现Comparable接口. Comparable只需实现compareTo()函数即可 public int compareTo(Objec