文档章节

Cpmparable与Comparator

 小鱼--
发布于 2017/05/10 14:25
字数 535
阅读 12
收藏 0
  1. Comparable
  2. Comparator

两者都用于实现集合中元素的比较、排序,Comparable是对象本身支持自比较时需要实现的接口,Comparator用于定义一个比较器,当对象不支持自比较或者不能满足你的要求时,可以自定义一个对象比较器。

Comparable实现样例:

public class Person implements Comparable<Person> {
    private String name;
    private int age;

    public Person() {
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public int compareTo(Person o) {
        int age2 = o.getAge();
        return age > age2 ? 1 : (age == age2 ? 0 : -1);
    }
}
@org.junit.Test
    public void testComparable() {
        Person p1 = new Person("lili", 20);
        Person p2 = new Person("jackson", 55);
        System.out.println(p1.compareTo(p2));
    }

测试结果:-1

Comparator实现样例:

public class MyComparator implements Comparator {

    @Override
    public int compare(Object o1, Object o2) {
        int arg1 = Math.abs(((Integer) o1).intValue());
        int arg2 = Math.abs(((Integer) o2).intValue());
        return arg1 > arg2 ? 1 : (arg1 == arg2 ? 0 : -1);
    }
}
    @org.junit.Test
    public void testComparator() {
        List<Integer> list = new ArrayList<Integer>();
        Integer a1 = new Integer(-1);
        Integer a2 = new Integer(2);
        Integer a3 = new Integer(-5);
        Integer a4 = new Integer(6);
        list.add(a1);
        list.add(a2);
        list.add(a3);
        list.add(a4);
        Collections.sort(list);
        System.out.println(JSON.toJSONString(list));
        Collections.sort(list, new MyComparator());
        System.out.println(JSON.toJSONString(list));
    }

结果:
[-5,-1,2,6]
[-1,2,-5,6]

 

实现Comparable接口的对象比较很好理解,对于Comparator,我们可以看下集合比较的源码:

//java.util.Collections#sort(java.util.List<T>, java.util.Comparator<? super T>)
public static <T> void sort(List<T> list, Comparator<? super T> c) {
	Object[] a = list.toArray();
	Arrays.sort(a, (Comparator)c);
	ListIterator i = list.listIterator();
	for (int j=0; j<a.length; j++) {
	    i.next();
	    i.set(a[j]);
	}
    }
private static void mergeSort(Object[] src,
                                  Object[] dest,
                                  int low, int high, int off,
                                  Comparator c) {
        int length = high - low;

        // Insertion sort on smallest arrays
        if (length < INSERTIONSORT_THRESHOLD) {
            for (int i = low; i < high; i++)
                for (int j = i; j > low && c.compare(dest[j - 1], dest[j]) > 0; j--)
                    swap(dest, j, j - 1);
            return;
        }

        // Recursively sort halves of dest into src
        int destLow = low;
        int destHigh = high;
        low += off;
        high += off;
        int mid = (low + high) >>> 1;
        mergeSort(dest, src, low, mid, -off, c);
        mergeSort(dest, src, mid, high, -off, c);

        // If list is already sorted, just copy from src to dest.  This is an
        // optimization that results in faster sorts for nearly ordered lists.
        if (c.compare(src[mid - 1], src[mid]) <= 0) {
            System.arraycopy(src, low, dest, destLow, length);
            return;
        }

        // Merge sorted halves (now in src) into dest
        for (int i = destLow, p = low, q = mid; i < destHigh; i++) {
            if (q >= high || p < mid && c.compare(src[p], src[q]) <= 0)
                dest[i] = src[p++];
            else
                dest[i] = src[q++];
        }
    }

集合长度小于INSERTIONSORT_THRESHOLD(7),采用快速排序算法;否则,归并排序算法

© 著作权归作者所有

粉丝 0
博文 18
码字总数 6405
作品 0
通州
程序员
私信 提问
深入了解Arrays.sort()

Arrays.sort(T[], Comparator<? super T> c) 是一个用于用户自定义排序对象的方法,在离线的JavaDoc中简单地描述了他怎么工作,但是没有更深入的解释,在这篇文章中,我们将讨论深入了解这个...

奋斗到天明
2015/08/27
0
0
java通过比较器对List进行排序

Comparator<Question> comparator = new Comparator<Question>() { @Override public int compare(Question s1, Question s2) { return s2.getTotal()-s1.getTotal(); } }; Collections.sort......

lindaliving
2014/05/30
0
0
java底层比较器Comparable和Comparator比较对象时的使用

刚开始学习java时可能对这2个接口存在一定的疑惑,对于Comparable意思是说:可以与此对象进行比较的那些对象的类型, 此接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然...

strict_nerd
2015/05/22
0
0
Comparable 和 Comparator 的区别

Java 中为我们提供了两种比较机制:Comparable 和 Comparator,他们之间有什么区别呢?今天来了解一下。 Comparable 自然排序 Comparable 在 java.lang 包下,是一个接口,内部只有一个方法 ...

Adel
2016/12/13
16
0
Java8 —— 函数式接口@FunctionalInterface及default关键字

最近在开发的过程中有一个点让我比较感兴趣,就是使用Lambda表达式的方式来实现Comparator接口。 1. 关于Comparator和Comparable 既然提到了Comparator,那就大致来说一下Comparator和Compa...

dela_
2018/11/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

JWT学习总结

官方 https://jwt.io 英文原版 https://www.ietf.org/rfc/rfc7519.txt 或 https://tools.ietf.org/html/rfc7519 中文翻译 https://www.jianshu.com/p/10f5161dd9df 1. 概述 JSON Web Token(......

冷基
今天
4
0
AOP的学习(1)

AOP 理解AOP编程思想(面向方法、面向切面) spring AOP的概念 方面 -- 功能 目标 -- 原有方法 通知 -- 对原有方法增强的方法 连接点 -- 可以用来连接通知的地方(方法) 切入点 -- 将用来插入...

太猪-YJ
今天
4
0
一张图看懂亮度、明度、光度、光亮度、明亮度

亮度、明度、光亮度,Luminance和Brightness、lightness其实都是一个意思,只是起名字太难了。 提出一个颜色模型后,由于明度的取值与别人的不同,为了表示区别所以就另想一个词而已。 因此在...

linsk1998
昨天
11
0
Python应用:python链表示例

前言 python链表应用源码示例,需要用到python os模块方法、函数和类的应用。 首先,先简单的来了解下什么是链表?链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是...

python小白1
昨天
5
0
Source Insight加载源码

Source Insight是一个图形化的源代码查看工具(当然也可以作为编译工具)。如果一个项目的源代码较多,此工具可以很方便地查找到源代码自建的依赖关系。 1.创建工程 下图为Snort源代码的文件...

天王盖地虎626
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部