• 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 }
  • 相关阅读:
    activity生命周期
    logcat
    URI
    intent Filter
    隐式intent
    intent
    訪问远程WAMP 下phpmyadmin
    CFileDialog的使用方法简单介绍
    JAVA wait(), notify(),sleep具体解释
    Android开发之去掉标题栏的三种方法,推荐第三种
  • 原文地址:https://www.cnblogs.com/zui-ai-java/p/14403933.html
Copyright © 2020-2023  润新知