comparable接口
Posted ljl150
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了comparable接口相关的知识,希望对你有一定的参考价值。
在java中,当要对两个对象进行比较时,因为对象一般都拥有较多的属性,java编译器(jdk)也不知道用户所要进行比较的是什么,id?name?
所对于对象的比较,一般都要给对象类实现comparable接口(不是继承对象,是因为在底层comparable()是被写成接口的),因为comparable接口
是泛型接口,且要比较的两个对象是Student类,所以要在尖括号中将类型参数写成Student类,然后还要注意的是在comparable接口中,compareTo()方法
是抽象方法,所以当对象实现了comparable接口后,还要对compareTo()方法进行重写(点击类实现后面的comparable,Alt+enter)。
代码实现:
1 package L14; 2 import java.util.Arrays; 3 class StudentText implements Comparable<StudentText>{ 4 private int id; 5 private String name; 6 public StudentText(int id,String name){ 7 this.id=id; 8 this.name=name; 9 } 10 public String getName() { 11 return name; 12 } 13 @Override 14 public int compareTo(StudentText o){ 15 return this.id >o.id?1:(this.id==o.id?0:-1); 16 } 17 @Override 18 public String toString(){ //重写tostring 19 String str="id:"+id+"name:"+name; 20 return str; 21 } 22 23 } 24 public class Student { 25 public static void main(String[] args) { 26 StudentText[] stu=new StudentText[3]; 27 stu[0]=new StudentText(101,"lisi"); 28 stu[1]=new StudentText(100,"zhangsan"); 29 stu[2]=new StudentText(102,"wangwu"); 30 System.out.println(Arrays.toString(stu)); //将数组中的各个元素打印出来 31 /** 32 * void sort(Object[] arr) 33 * { 34 * if(arr[i] instanceOf Cmparable) 35 * { 36 * Comparable obj=(Comparable)arr; 37 * obj.compareTo(xx) 38 * } 39 */ 40 Arrays.sort(stu); //对数组中元素进行排序 41 System.out.println(Arrays.toString(stu)); 42 43 44 } 45 }
运行结果:
分析:1.之所以可以用sort()方法进行排序。是因为sort()方法在底层进行了如下判断。所以要对对象进行比较时,要先给对象实现comparable接口。
否则无法使用sort()方法。
/**
* void sort(Object[] arr)
* {
* if(arr[i] instanceOf Cmparable) //即数组实现了Comparable接口
* {
* Comparable obj=(Comparable)arr;
* obj.compareTo(xx)
* }
*/
2. 使用该方法 Arrays.toString(stu) 就可以将stu数组中的所有元素的所要打印的内容都打印出来
但是每次比较不一定都比较的是id,不同的人有不同的需求,但不可能因为其他人的需求就将用户的源代码就行删改,基于sort()方法,
Java还提供了另一种实现比较的方式(自定义的比较器)。
即:新new一个类,对这个类实现Comparator接口(注意与Comparable接口的区分),因为Comparator接口里面定义的用来
比较的方法compare()是抽象的,所以在这个新类里面要对它就行重写。
*********************************************************************************
*******************************************************************************************
***********************************************************************************************
然后在调用sort()方法时,将写的用于比较的那个类也赋进来(以new 对象的方式)。
代码实现:
1 package L14; 2 import java.util.Arrays; 3 import java.util.Comparator; 4 class StudentText implements Comparable<StudentText>{ 5 private int id; 6 private String name; 7 public StudentText(int id,String name){ 8 this.id=id; 9 this.name=name; 10 } 11 public String getName() { 12 return name; 13 } 14 @Override 15 public int compareTo(StudentText o){ 16 return this.id >o.id?1:(this.id==o.id?0:-1); 17 } 18 @Override 19 public String toString(){ //重写tostring 20 String str="id:"+id+"name:"+name; 21 return str; 22 } 23 24 } 25 class StudentCompareName implements Comparator<StudentText> { 26 @Override 27 public int compare(StudentText o1, StudentText o2) { 28 return o1.getName().compareTo(o2.getName()); //字符串类型本身也提供了compareTo()方法 29 } 30 } 31 public class Student { 32 public static void main(String[] args) { 33 StudentText[] stu=new StudentText[3]; 34 stu[0]=new StudentText(101,"lisi"); 35 stu[1]=new StudentText(100,"zhangsan"); 36 stu[2]=new StudentText(102,"wangwu"); 37 System.out.println(Arrays.toString(stu)); //将数组中的各个元素打印出来 38 /** 39 * void sort(Object[] arr) 40 * { 41 * if(arr[i] instanceOf Cmparable) 42 * { 43 * Comparable obj=(Comparable)arr; 44 * obj.compareTo(xx) 45 * } 46 */ 47 Arrays.sort(stu); //对数组中元素进行排序 48 System.out.println(Arrays.toString(stu)); 49 Arrays.sort(stu,new StudentCompareName()); 50 System.out.println(Arrays.toString(stu)); 51 52 } 53 }
运行结果:
但又因为在每次比较一种属性时,都得定义一个类,而且定义的这个类也只能在这个地方使用,所以java又研究出了一种更简单的写法。
即:定义一个实现Comparator接口的匿名对象
然后在调用sort()方法时,将对象和 定义的那个常量作为参数,一并传入。
此处Comparator<StudentText> NAME_COMP = new Comparator <StudentText>() 不是实例化接口。
而是实例了一个实现了Comparator接口的对象。
***********************************************************************************************************************
此外还可以:
Arrays.sort(stu,(a,b)->{return a.getName().compareTo(b.getName());});
好处是不用实现接口,也不用重写方法。
以上是关于comparable接口的主要内容,如果未能解决你的问题,请参考以下文章
Java集合框架 Set接口实现类--TreeSet补充: Comparator接口
这段代码里的Object类型为啥能被强制转换为Comparable接口类型呢?