java中comparable和comparator

来源:互联网 发布:法律硕士就业前景知乎 编辑:程序博客网 时间:2024/06/06 04:00

在java中,如果想实现两个对象之间的比较,那么我们有两种选择。一是实现comparable<T>接口中的int compareTo(T o)方法。二是实现comparator接口中的int compare<T>(T o1,T o2)方法。上面的两种方法都返回一个int值,若大于0,说明第一个对象大,等于0表示相等,小于0,说明对象小.下面介绍一下两者的区别。

1.comparable –自己与其他对象比较

我们看到comparable接口中的用于比较的compareTo<T>(T o)方法,参数只有一个。并且通过这个方法名compareTo()也可以推断是自己与其他对象比较。

import java.util.ArrayList;import java.util.Collections;import java.util.Iterator;public class TestComparable implements Comparable<TestComparable> {    private int version;    @Override    public int compareTo(TestComparable o) {// 重写compareTo方法,只有一个参数        return this.version - o.version;    }    public TestComparable(int version) {        super();        this.version = version;    }    @Override    public String toString() {        return "TestComparable [version=" + version + "]";    }    public static void main(String[] args) {        TestComparable t1 = new TestComparable(1);        TestComparable t2 = new TestComparable(3);        ArrayList<TestComparable> list = new ArrayList<TestComparable>();        list.add(t2);        list.add(t1);        Collections.sort(list);//用collections排序        for (Iterator iterator = list.iterator(); iterator.hasNext();) {            TestComparable testComparable = (TestComparable) iterator.next();            System.out.println(testComparable);        }    }}结果:TestComparable [version=1]TestComparable [version=3]我们看到 collections.sort 如下public static <T extends Comparable<? super T>> void sort(List<T> list) {        list.sort(null);    }

2.comparator –第三方的比较机构

comparator类似于一个三方比较机构,专门用来处理那些比较双方不能处理的问题。也就是说比较双方可能没有实现comparable接口,或者是比较的方式不是我们想要的。举个例子,比如Integer类是按照大小进行比较,但是我们想按照绝对值进行比较等等这种情况。

package com.test.oj;import java.util.Arrays;import java.util.Comparator;public class TestComparator {    int version;    public TestComparator(int version) {        super();        this.version = version;    }    @Override    public String toString() {        return "TestComparator [version=" + version + "]";    }    public static void main(String[] args) {        TestComparator t1 = new TestComparator(1);        TestComparator t2 = new TestComparator(3);        TestComparator[] t = { t2, t1 };        Arrays.sort(t, new cm());        System.out.println(t[0]);    }}// 这就是所谓的地方比较机构 ,并且该机构定义了比较的规则class cm implements Comparator<TestComparator> {    @Override    public int compare(TestComparator o1, TestComparator o2) {        return o1.version - o2.version;    }}结果:TestComparator [version=1]

3.常用数据类型的比较

  • Integer 等数字类型
public final class Integer extends Number implements Comparable<Integer> //实现Comparablepublic int compareTo(Integer anotherInteger) {        return compare(this.value, anotherInteger.value);    }public static int compare(int x, int y) {        return (x < y) ? -1 : ((x == y) ? 0 : 1);    }//就是按照大小进行比较的
  • String 类型
//实现comparable接口public final class String     implements java.io.Serializable, Comparable<String>, CharSequence    //重写compareTo方法    public int compareTo(String anotherString) {        int len1 = value.length;        int len2 = anotherString.value.length;        int lim = Math.min(len1, len2);        char v1[] = value;        char v2[] = anotherString.value;        int k = 0;        while (k < lim) {//先从首字母开始判断            char c1 = v1[k];            char c2 = v2[k];            if (c1 != c2) {                return c1 - c2;            }            k++;        }        return len1 - len2;//若前面的字母都相等,则比较长度    }
0 0
原创粉丝点击