Java比较器之Comparable接口 和 Comparator接口

  1 package day2_15;
  2 
  3 import org.junit.Test;
  4 
  5 import java.util.Arrays;
  6 import java.util.Comparator;
  7 
  8 /**
  9  * 一:说明:Java中的对象,正常情况下,只能进行比较:== 或 !=,不能使用 > 或 <的
 10  *          但是在开发场景中,我们需要对多个对象进行排序,也就是需要比较对象的大小。
 11  *          如何实现?使用两个接口中的任何一个  Comparable 或 Comparator
 12  *
 13 *  二:Comparable接口的使用举例 ---->自然排序
 14  *      1.像String,包装类,File,java.util.Date类等实现了Comparable接口,重写了compareTo(Object obj),
 15  *        给出了比较两个对象大小的方式
 16  *      2.像String,包装类重写了compareTo(obj)以后,进行了从小到大的排序
 17  *      3.重写compareTo()的规则:
 18  *          如果当前对象this 大于 形参对象obj,则返回正整数
 19  *          如果当前对象this 小于 形参对象obj,则返回负整数
 20  *          如果当前对象this 等于 形参对象obj,则返回零
 21  *      4.对于自定义类来说,如果需要排序,我们可以让自定义类实现Comparable接口,重写compareTo(obj)方法,
 22  *          在方法中指明如何排序
 23  *
 24  *
 25  * @Author Tianhao
 26  * @create 2021-02-15-13:56
 27  */
 28 public class CompareTest {
 29 
 30     @Test
 31     public void test1() {
 32         String[] arr = {"AA", "MM", "GG", "KK", "DD", "JJ"};
 33         Arrays.sort(arr);
 34         System.out.println(Arrays.toString(arr));//[AA, DD, GG, JJ, KK, MM]
 35     }
 36 
 37 
 38     @Test
 39     public void test2() {
 40         Goods[] arr = new Goods[4];
 41         arr[0] = new Goods("huaweiMouse",43);
 42         arr[1] = new Goods("lenovoMouse",34);
 43         arr[2] = new Goods("dellMouse",43);
 44         arr[3] = new Goods("xiaomiMouse",12);
 45 
 46 
 47         Arrays.sort(arr);
 48         System.out.println(Arrays.toString(arr));
 49     }
 50 
 51 
 52 
 53     /*
 54     三:Comparator接口的使用举例 ---->定制排序
 55     1.背景
 56         当元素的类型没有实现java.lang.Comparable接口而又不方便修改代码,
 57         或者实现了java.lang.Comparable接口的排序规则,但不适合当前的操作,
 58         那么可以考虑使用Comparator的对象来排序
 59     2.重写 int compare(T o1, T o2),比较o1和o2的大小:
 60         方法返回正整数,则表示o1大于o2
 61         方法返回负整数,则表示o1小于o2
 62         方法返回零,则表示o1等于o2
 63 
 64     3.Comparable 和 Comparator的使用对比
 65        Comparable接口一旦被某类实现,那么这个实现类在任何位置都可以比较大小
 66        Comparator接口属于临时性的比较。(通常使用匿名实现类即可)
 67 
 68      */
 69 
 70 
 71     @Test
 72     public void test3() {
 73         String[] arr = {"AA", "MM", "GG", "KK", "DD", "JJ"};
 74         Arrays.sort(arr,new Comparator<String>(){
 75 
 76             @Override
 77             public int compare(String o1, String o2) {
 78                 //按照字符串对象从大到小排序
 79                 return -o1.compareTo(o2);
 80             }
 81         });
 82         System.out.println(Arrays.toString(arr));
 83 
 84     }
 85 
 86     @Test
 87     public void test4() {
 88         Goods[] arr = new Goods[6];
 89         arr[0] = new Goods("huaweiMouse",43);
 90         arr[1] = new Goods("iphoneMouse",55);
 91         arr[2] = new Goods("lenovoMouse",34);
 92         arr[3] = new Goods("dellMouse",43);
 93         arr[4] = new Goods("xiaomiMouse",12);
 94         arr[5] = new Goods("iphoneMouse",10);
 95 
 96         Arrays.sort(arr, new Comparator<Goods>() {
 97             @Override
 98             public int compare(Goods o1, Goods o2) {
 99                 //指明商品比较大小的方式:商品名称从低到高排序,如果名称相同,再按照价格从高到低排序
100                 //方式一:
101 //                if ((o1.getName().compareTo(o2.getName()))< 0) {
102 //                    return -1;
103 //                }else if ((o1.getName().compareTo(o2.getName())) > 0) {
104 //                    return 1;
105 //                }else{
106 //                    if (o1.getPrice() < o2.getPrice()) {
107 //                        return 1;
108 //                    } else if (o1.getPrice() > o2.getPrice()) {
109 //                        return -1;
110 //                    } else {
111 //                        return 0;
112 //                    }
113 //                }
114 
115                 //方式二:
116                 if (o1.getName().equals(o2.getName())) {
117                     return -Double.compare(o1.getPrice(), o2.getPrice());
118                 } else {
119                     return o1.getName().compareTo(o2.getName());
120                 }
121 
122             }
123         });
124 
125         System.out.println(Arrays.toString(arr));
126     }
127 
128 
129 }

 

posted @ 2021-02-15 16:37  dog_IT  阅读(81)  评论(0)    收藏  举报