读JSE源码(二):Comparable接口和Comparator接口
来源:互联网 发布:天气预报数据库 编辑:程序博客网 时间:2024/06/03 19:21
目录
1 介绍
2 Comparable接口
3 Comparator接口
4 总结
1 介绍
有这样2个人,一个人光头,一个人有黑色头发,现在不允许染发,只允许光头的带假发,理由是有头发的人没有必要再带假发,那么谁可以有多种颜色的头发?在这种情况下,有头发的人,因为他的头发和自身绑定在一起,是无法在换头发的;而光头的头发(假发套)和其自身是不绑定的,可以根据自己喜欢换不同颜色的发套。有头发的人叫Comparable,光头不是孟飞,也不是乐嘉,叫Comparator。
Comparable和Comparator是java中2个比较接口。Comparable是和具体类绑定的,我们称为“静态绑定”(如上图中有头发的人,头发是Comparable,头是具体的类)。而对于Comparator,具体的类在需要是可选择不同的Comparator绑定,是“动态绑定”(策略模式)(如上图中光头的人,假发是Comparator,头是具体的类,可根据需要选择不同的假发)。两者相比,Comparator比Comparable灵活,而且具体类可以在需要时选择不同的Comparator。
2 Comparable接口
java.lang. Comparable接口定义类的自然顺序,实现该接口的类就可以按这种方式排序。Comparable只包含一个方法:
public interface Comparable<T> { public int compareTo(T o); }
import java.util.Arrays;/** * @version 1.0 * @date 2012-11-15 下午2:25:27 * @fuction 实现Comparable接口 (先按序号比较,序号相等在比较姓名) */publicclass Student implements Comparable{//学号int num;//姓名String name;//constructorpublic Student(int num,String name){this.num=num;this.name=name;}//重写java.lang中的接口Comparable的方法compareTo,定制比较的规则.但必须遵守比较规则(比较结果大返回正数,相等返回0,小返回负数)public int compareTo(Object o) {Student s=(Student)o;int result=num>s.num ? 1:(num==s.num ? 0: -1);//学号相等时,按名字排序if(0==result){//利用String的compareTo方法进行字符的比较 result=name.compareTo(s.name);}return result;}@Overridepublic String toString() {return "Student [num=" + num + ", name=" + name + "]";}/** * @param args */public static void main(String[] args) {Student[] test=new Student[]{new Student(2, "wangwu"), new Student(1, "lisi"), new Student(1, "goudan") };//排序Arrays.sort(test);//打印for(int i=0;i<test.length;i++){System.out.println(test[i]);}//搜索姓名为“wangwu”的学生 int index=Arrays.binarySearch(test,new Student(2,"wangwu")); System.out.println("查找的学生在数组中的位置:"+index); }}
3 Comparator接口
java.util.Comparator接口只包含2个方法
int compare(T o1, T o2);
boolean equals(Object obj);
int compare(T o1, T o2);比较用来排序的两个参数。
boolean equals(Object obj);指示是否其他对象“等于”此 Comparator。
实现了compare接口的类具体的实现是在compare方法中自定义比较算法,然后将Comparator对象(实现了java.util.Comparator接口的对象)作为一个参数传递给欲比较或排序对象collection的某些排序方法。某些排序方法指的是能够接受java.util.Comparator参数的方法,比如:java.util. Arrays的public static void sort(Object[] a, Comparator c)和Collections的sort方法。
例子
import java.util.Arrays;import java.util.Comparator;/** * @version 1.0 * @date 2012-11-15 下午11:21:09 * @fuction 实现Comparator接口的比较算法 *按学号排序 先按学号排序,学号相等时,按姓名排序 o1>o2返回1,o1=o2返回0,o1>o2返回-1 */public class ByNumComparator implements Comparator {public int compare(Object o1, Object o2) {Student s1 = (Student) o1;Student s2 = (Student) o2;// 按学号排序int result = s1.num > s2.num ? 1 : (s1.num == s2.num ? 0 : -1);// 学号相等时,按名字排序if (result == 0) {int copmpareName=s1.name.compareTo(s2.name);//利用String的compareTo方法进行字符的比较 if(copmpareName>0)result=1; else if (copmpareName==0)result=0; elseresult=-1;}return result;}public static void main(String[] args) {Student[] test = new Student[] { new Student(2, "wangwu"),new Student(1, "lisi"), new Student(1, "goudan") };// 排序Arrays.sort(test, new ByNumComparator());// 打印System.out.println("排序之后");for (int i = 0; i < test.length; i++) {System.out.println(test[i]);}}}
输出结果:
排序之后
Student [num=1, name=goudan]
Student [num=1, name=lisi]
Student [num=2, name=wangwu]
4 总结
一般在对对象进行比较或排序时,需要对象实现Comparable接口或者在使用排序方法(比如Arrays的sort)方法时,传入实现了Comparator接口的类的对象。
- 读JSE源码(二):Comparable接口和Comparator接口
- ):Comparable接口和Comparator接口
- Comparator和Comparable接口
- Comparable 和 Comparator接口
- Comparable和Comparator接口
- Comparator和Comparable接口
- Comparable和Comparator接口
- Comparable和Comparator接口
- Comparable接口和Comparator接口
- Comparable接口和Comparator接口
- Comparable接口和Comparator接口
- Comparable接口和Comparator接口
- JAVA学习笔记(二十三)-Comparable接口和Comparator接口
- 实现 Comparable 和 Comparator 接口
- Comparable和Comparator接口比较
- 黑马程序员----Comparable接口和Comparator接口
- Comparable接口和Comparator接口区别
- Comparable接口和Comparator接口的区别
- android与javascript交互调用
- 在C语言中利用有限状态自动机模拟编译器去除代码中/**/类注释的程序实现
- Java 大数类 目前仅实现正数的加法和乘法
- Python 编码时应该注意的几件事情
- android之Service介绍之一
- 读JSE源码(二):Comparable接口和Comparator接口
- android之视频播放控件VideoView简单应用
- POJ 1141
- mfc c++ CString 转换成string解决方法
- android之Service介绍之二 AIDL
- Office文档在线编辑的实现
- android之Service介绍之三 AIDL与传递对象
- Linux fork函数
- 如果编程语言是女人