zoukankan      html  css  js  c++  java
  • Comparable接口和Comparator接口

    Comparable和Comparator接口简介

    Comparable接口和Comparator接口的作用 : 用于给实现类规范比较(排序)的方法.

    首先看两个接口的代码:

    Comparable接口

    public interface Comparable<T> {
        public int compareTo(T o);
    }

    Comparator接口

    @FunctionalInterface
    public interface Comparator<T> {
        int compare(T o1, T o2);
        //其他默认方法和静态方法;
        //......
    }

    比较两个接口的代码,我们可以看到:

      1.Comparable的compareTo(T)方法只有1个参数,.

      2.Comparator接口的compare(T o1, T o2)方法有两个参数, 有@FunctionalInterface接口,所以有Lambda表达式的用法

    所以,

      Comparable只能在类内部实现比较功能,让想让实现比较功能的类自身实现Comparable接口

      Comparator可以做成比较器类,让比较器类实现Comparator接口

    Comparator接口为什么有多个抽象方法还被标注为函数式接口?

      compare(T o1, T o2)方法外的另一个抽象方法equals(Object obj)是Object类的方法,因此所有类都有该方法,不影响Comparator作为函数式接口(瞎猜的).

      *接口并非继承自Object,只是接口定义了一套与Object完全相同的方法(详细内容可以网上查询一下,这里暂不讨论)

    如何让类实现比较功能?

    让该类实现Comparable接口,并重写接口内的compareTo(T o)方法,示例如下

    public Person implaments Comparable{
        private int id;
        private String name;
        //......构造函数及get/set方法省略
        
        @Override
        public int compareTo(Person p) {
            int result = this.id-p.getId();
            if(result<0) return -1;
            if(result > 0) return 1;
            return 0;
        }
    }    
    

      这样,该Person类就具备了比较的功能,当要给ArrayList<Person> list排序的时候,就可以调用Collections.sort(List T)方法,来实现对集合list的排序.

    如果类没有实现比较功能,怎么给装有该类的List集合排序?

      答案是: 使用比较器(Comparator)

    有两种使用方法: 

    一.调用Collections.sort(List T, Comparator<? super T> c)重载方法,传入list和比较器对象实现排序

    Collections.sort(list1, new Comparator<String>() {
    	@Override
    	public int compare(String o1, String o2) {
    		int a = Integer.parseInt(o1);
    		int b = Integer.parseInt(o2);
    		if (a>b) return 1;
    		if (a<b) return -1;
    		return 0;
    	}
    });
    

      

    二.使用List的sort(Comparator<? super T> c)方法,传入比较器对象来排序

    list1.sort(new Comparator<String>() {
        @Override
        public int compare(String o1, String o2) {
            int a = Integer.parseInt(o1);
            int b = Integer.parseInt(o2);
            if (a>b) return 1;
            if (a<b) return -1;
            return 0;
        }
    )
    

      因为Comparator接口是函数式接口,所以List的sort()方法和Collections的sort()方法,都可以用Lambda表达式的写法.

      

    Collections.sort(list1, (a,b) -> {
      //......省略
      return 0;
    });
    list1.sort((a, b) -> {
      //......省略
      return 0;
    });
    

      

    fff

  • 相关阅读:
    sync 解释
    USB枚举详细过程剖析(转)
    内核早期内存分配器:memblock
    LTE:eMBMS架构
    对linux内核中jiffies+Hz表示一秒钟的理解
    android的USB MTP && USB CDC/USBnet(ECM, NCM, ACM) && USB gardget
    Install Shield中调用devcon自动安装硬件驱动程序
    利用 devcon.exe实现自动安装驱动(转)
    linux系统IO调度算法
    ZooKeeper原理详解及常用操作
  • 原文地址:https://www.cnblogs.com/jinyu59/p/10759214.html
Copyright © 2011-2022 走看看