---------------------- android培训、java培训、期待与您交流! ----------------------
今天忽然感觉黑马论坛真的是个查落补缺的好地方,比如今天看别人的提问中用到了一个实现Comparator接口的类,我当时就懵了一下。之前要让一个类可以被排序都是实现Comparable接口的,Comparator这个接口还真的是没关注过。于是赶紧诚惶诚恐的去网上找有关内容学习,顿时茅塞顿开,曾经困然我的一个问题也迎刃而解。下面是我翻译的一段英文资料。
Comparator接口与Comparable接口都是Java中用于支持对象比较的,继承了这两个借口的类的对象可以按照某种预先设定好的规则被排序
实现了Comparable接口的类的对象,可以使用其自身与其他对象进行比较,也就是说实现了Comparable接口的类自身是可排序的;实现了Comparator接口的类的对象自身并不能被排序,这样的类被称为比较器,比较器中包含了预先设定好的比较条件,用来给其他类的对象进行排序。
Comparable接口中要求必须实现的方法是:int compareTo(Object o1)
这个方法是将对象自身按照一定条件与另一个对象进行比较
如果对象本身大于o1则返回正数
如果对象本身等于o1则返回零
如果对象本身小于o1则返回负数
Comparator接口中要求必须实现的方法是:int compare(Object o1, Object o2)
这个方法是将其他类的两个对象按照一定条件进行比较
如果o1大于o2则返回正数
如果o1等于o2则返回零
如果o1小于o2则返回负数
Collections与Arrays类除了提供了给实现Comparable接口的类进行排序的sort方法Collections.sort(List),Arrays.sort(Object[]),并且还接收比较器来对对象进行排序的sort方法sort(List, Comparator),Arrays.sort(Object[], Comparator)
之前,我曾经碰到过一个问题,就是说,有一个学生类
public classStudent {
private String name;
private int age;
private int mark;
/*
* getter/setter 方法
*/
}
题目要求是用一个长度为n的学生类的数组,要求在这个数组实现分别根据姓名,年龄和成绩进行排序的功能,当时我只知道Comparable接口,或者说在写这篇博客之前我也就知道Comparable接口。当时可把我费劲坏了,因为Comparable接口只能以一个条件来进行排序,比如我用年龄作为条件,那么使用姓名和程序进行排序的方法我就要自己一点点慢慢写,我记得当时我图省事用了冒泡排序法来做的另外两个功能。虽然说排序算法是程序员都要掌握的基础知识,但是比如快速排序,堆排序,这样的算法理解起来不难,但是实现起来还是挺麻烦的,尤其是快速排序算法,如果不适用递归来写会很痛苦,但是程序员守则上的第一条我认为就是,尽可能的不去适用递归。
现在有了Comparator接口就好了,对于我说的这个题目,完全可以实现三个不同的比较器,比如 SortByName, SortByAge, SortByMark这样的三个比较器类,然后往Arrays.sort(Object[],Comparator)里面一丢,好了,搞定~!
---------------------- android培训、java培训、期待与您交流! ----------------------
详细请查看:http://edu.csdn.net/heima