Comparable与Comparator接口的区别

Comparable与Comparator接口在数据排序中经常用到,最近差点把他们用混淆了,以下是自己编写的分析它们区别的测试代码。


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

/**
 * 主要区别:
 * 假设有人给你一个并没有实现Comparable的类,或者你的类实现了Comparable,
 * 但是你不喜欢它的实现方式,你需要另外一种不同的比较方法,要解决这个问题,可以创建
 * 一个实现了Comparator接口的单独的类。Comparable实现一般用于类的自比较 ,
 * 而比较器Comparator实现不仅可以自比较,而且还可以用于没有继承关系的不同类型对象的比较。
 * 
 * @author LeiMin
 */
public class Comptype {

    /**
     * @param args
     */
    public static void main(String[] args) {
        List<Object> list = new ArrayList<Object>();
        A a = new A(6);
        A a1 = new A(12);
        A a2 = new A(8);
        B b = new B(14);
        B b1 = new B(11);
        list.add(a);
        list.add(a1);
        list.add(a2);
        list.add(b);
        list.add(b1);
        System.out.println(list);
        //使用自定义的比较器排序
        Collections.sort(list, new Comparator() {

            @Override
            public int compare(Object o1, Object o2) {
                if (o1.getClass() == o2.getClass()) {
                    if (o1 instanceof B)
                        return ((B) o1).getB() - ((B) o2).getB();
                    else if (o1 instanceof A)
                        return ((A) o1).getA() - ((A) o2).getA();
                } else {
                    if (o1 instanceof A && o2 instanceof B)
                        return ((A) o1).getA() - ((B) o2).getB();
                    else if (o1 instanceof B && o2 instanceof A)
                        return ((B) o1).getB() - ((A) o2).getA();
                }
                return 0;
            }

        });
        System.out.println(list);
        List<A> list1 = new ArrayList<A>();
        list1.add(a);
        list1.add(a1);
        list1.add(a2);
        list1.add(b);
        list1.add(b1);
        System.out.println(list1);
        //使用类自带自然排序方法排序
        Collections.sort(list1);
        System.out.println(list1);
        List<Object> list2 = new ArrayList<Object>();
        C c = new C(20);
        list2.add(a);
        list2.add(c);
        //不同类型对象排序比较不能使用Comparable实现
        //        Collections.sort(list2); // compile error 
        //        Comparable[] c = new Comparable[] { a, a1, a2, b, b1 };
        //        print(c);
        //        insertionSort(c);
        //        print(c);

    }

    /*
     * public static void print(Comparable[] data) { if (data != null &&
     * data.length > 0) { StringBuilder sb = new StringBuilder("["); for (int i
     * = 0; i < data.length; i++) sb.append(data[i]).append(", ");
     * sb.deleteCharAt(sb.length() - 2).deleteCharAt(sb.length() -
     * 1).append("]"); System.out.println(sb); } } public static void
     * insertionSort(Comparable[] data) { for (int index = 1; index <
     * data.length; index++) { Comparable key = data[index]; int position =
     * index; //把较大值右移一位 while (position > 0 && data[position -
     * 1].compareTo(key) > 0) { data[position] = data[position - 1]; position--;
     * } data[position] = key; } }
     */
}

class A implements Comparable<A> {

    /**
     * 
     */
    public A() {
        super();
    }

    private int a;

    /**
     * @return the a
     */
    public int getA() {
        return a;
    }

    /**
     * @param a the a to set
     */
    public void setA(int a) {
        this.a = a;
    }

    /**
     * @param a
     */
    public A(int a) {
        super();
        this.a = a;
    }

    @Override
    public String toString() {
        return "A[a=" + a + "]";
    }

    @Override
    public int compareTo(A o) {
        if (o instanceof B)
            return a < ((B) o).getB() ? -1 : (a == ((B) o).getB() ? 0 : 1);
        else if (o instanceof A)
            return a < ((A) o).getA() ? -1 : (a == ((A) o).getA() ? 0 : 1);
        else
            return 0;
    }
}

class B extends A {

    private int b;

    /**
     * @return the b
     */
    public int getB() {
        return b;
    }

    /**
     * @param b the b to set
     */
    public void setB(int b) {
        this.b = b;
    }

    /**
     * @param b
     */
    public B(int b) {
        this.b = b;
    }

    @Override
    public String toString() {
        return "B[b=" + b + "]";
    }

    @Override
    public int compareTo(A o) {
        if (o instanceof B)
            return b < ((B) o).getB() ? -1 : (b == ((B) o).getB() ? 0 : 1);
        else if (o instanceof A)
            return b < ((A) o).getA() ? -1 : (b == ((A) o).getA() ? 0 : 1);
        else
            return 0;
    }

}

class C implements Comparable<Object> {

    /**
     * @return the c
     */
    public int getC() {
        return c;
    }

    /**
     * @param c
     */
    public C(int c) {
        super();
        this.c = c;
    }

    /**
     * @param c the c to set
     */
    public void setC(int c) {
        this.c = c;
    }

    private int c;

    @Override
    public int compareTo(Object o) {
        if (o instanceof A)
            return c - ((A) o).getA();
        else if (o instanceof C)
            return c - ((C) o).getC();
        return 0;
    }

}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值