Java比较器
比较器有两种:Comparable接口与Comparator接口,用于对象之间的比较
1:Comparable接口:称为自然排序,String类,包装类都继承了此接口,且实现了CompareTo方法
使用:对于自定义类对象所属的类首先需要实现Comparable接口,其次实现其中的CompareTo(Object obj)方法,最后重写所在类的toString方法,因为数组的遍历需要调用Arrays.toString(arr[]);
对于compareTo方法重写的规则:当前对象this大于形参obj返回值为正整数,小于返回值为负整数,等于时为0,然后抛出运行异常
2:Comparator接口:称为定制排序,还未完全理解
1 /** 2 * java比较器 3 * 说明:Java中的对象正常情况下只能进行比较:==或!=不能使用<或>的 4 * 但是在开发当中,我们需要对多个对象进行排序,需要对对象比较大小, 5 * 使用两个接口中的任何一个,Comparable或Comparator 6 * 一:Comparable接口的使用:自然排序 7 * 二:Comparator接口的使用:定制排序,自己设置排序的方式,从低往高,等等 8 * 9 */ 10 public class CompareTest { 11 /** 12 *Comparable接口的使用: 自然排序 13 * 1:String,包装类都实现了Comparable接口,重写了compareTo方法,给出了比较两个对象大小的方法: 14 * 2:像String,包装类重写compareTo方法后,进行了从小到大的排序 15 * 3:重写compareTo(obj)方法的规则: 16 * 如果当前对象this大于形参obj,返回正整数 17 * 如果当前对象this小于形参obj,返回负整数 18 * 如果当前对象this等于形参obj,返回0 19 * 4:对于自定义类:如果需要排序,可以让自定义类实现Comparable接口,重写compareTo方法, 20 * 再compareTo方法中说明如何排序,记得重写toString方法,因为如果是存在数组里面会调用sort方法先进行排序 21 * 之后因为是数组,所以遍历需要调用Array.toString方法,所以必须重写toString方法 22 * 23 * 24 */ 25 26 @Test 27 public void test(){ 28 String[] arr=new String[]{"aa","bb","dd","hh","ee","cc"} ; 29 Arrays.sort(arr); 30 System.out.println(Arrays.toString(arr)); 31 //自定义类students 32 Students students1=new Students(23,"张三"); 33 Students students2=new Students(19,"李四"); 34 Students students3=new Students(19,"黄鹏鹏"); 35 Students students4=new Students(30,"奥巴马"); 36 Students[]array=new Students[]{students1,students2,students3,students4}; 37 Arrays.sort(array); 38 System.out.println(Arrays.toString(array)); 39 } 40 41 /** 42 * Comparator接口:定制排序 43 * Comparator接口的使用背景:当元素的类未实现Comparable接口或者Comparable接口提供的排序不符合要求时 44 * 可以考虑使用Comparator接口进行定制排序 45 * 1: 46 * 47 * 48 */ 49 @Test 50 public void test2(){ 51 Students students1=new Students(23,"黄鹏鹏"); 52 Students students2=new Students(19,"艾四"); 53 Students students3=new Students(19,"黄鹏鹏"); 54 Students students4=new Students(30,"奥巴马"); 55 Students[]array=new Students[]{students1,students2,students3,students4}; 56 Arrays.sort(array); 57 System.out.println(Arrays.toString(array)); 58 } 59 }
**********************************************************
1 public class Students implements Comparable,Comparator { 2 private int age; 3 private String name; 4 5 @Override 6 public String toString() { 7 return this.age+this.name; 8 } 9 10 public Students(int age, String name) { 11 this.age = age; 12 this.name = name; 13 } 14 15 public int getAge() { 16 return age; 17 } 18 19 public void setAge(int age) { 20 this.age = age; 21 } 22 23 public String getName() { 24 return name; 25 } 26 27 public void setName(String name) { 28 this.name = name; 29 } 30 //重写compareTo方法,指明按照什么方式排序 31 @Override 32 public int compareTo(Object o) { 33 if (o instanceof Students){ 34 Students students=(Students) o;//将传进来的形参o进行强转 35 if (this.age>students.age){//价格从低到高排序 36 return 1; 37 }else if (this.age<students.age){ 38 return -1; 39 }else { 40 return -this.name.compareTo(students.name); 41 //如果年龄相等,按照name进行排序,"-"表示从低到高 42 } 43 } 44 throw new RuntimeException("传入的数据类型不匹配");//返回值可以设置为抛出运行时异常 45 } 46 47 @Override 48 public int compare(Object o1, Object o2) { 49 if (o1 instanceof Students&& o2 instanceof Students){ 50 Students students1=(Students) o1;//进行强转 51 Students students2=(Students) o2; 52 if (students1.name.equals(students2.name)){ 53 return compare(students1.age,students2.age); 54 }else { 55 return compare(students1.name,students2.name); 56 } 57 } 58 throw new RuntimeException("输入的数据类型错误"); 59 } 60 }
浙公网安备 33010602011771号