zoukankan      html  css  js  c++  java
  • Java中Comparable讲解

    Comparable是排序接口;若一个类实现了Comparable接口,就意味着“该类支持排序”。可以使用Arrays.sort()对改类进行排序。

    讲解

    1.Comparable接口

    使用场景:假如说我们有这样一个需求,需要设计一个Person类,有两个属性:姓名(name)、年龄(age),按照年龄的大小进行排序,那么实现可以这样

    package com.ikos.web;
    
    import java.util.Arrays;
    
    class Person implements Comparable<Person>{
        int age;
        String name;
    
        public Person(String name,int age){
            this.name = name;
            this.age = age;
        }
    
        @Override
        public String toString() {
            // TODO Auto-generated method stub
            return "姓名:"+name+","+"年龄:"+age+";";
        }
    
        @Override
        public int compareTo(Person o) {
            // TODO Auto-generated method stub
            if(this.age>o.age){
                return 1;
            }else if(this.age<o.age){
                return -1;
            }
            //当然也可以这样实现
            // return Integer.compare(this.age, o.age);
            return 0;
        }
        public static void main(String[] args) {
    
            Person []persons = new Person[]{
                    new Person("张三",15),
                    new Person("李四",25),
                    new Person("王五",20)
            };
            Arrays.sort(persons);
            System.out.println(Arrays.toString(persons));
            System.out.println(persons[0]==persons[1]);
            System.out.println(persons[0].equals(persons[1]));
    
        }
    }

    结果:

    注意细节:

    Comparable<T>接口里面有一个泛型T,T的选择为可以与之比较的对象的类型,一般就是实现该接口类的本身,可以这样想和Person类比较的当然是Person本身了。
    Comparable<T>只是在Arrays里面起作用,其他地方目前我并没有发现什么作用,包括运算符和equals上,这个接口也不起什么作用

    2.Comparator接口

    Comparator也是一个比较器,但是属于挽救设计的一种,一般来说尽量减少。

    下面的例子演示了Comparator泛型的使用"extends"如何使用在一般意义上的意思"extends"(类)或者"implements"(接口)。

    该例子中的泛型方法返回三个可比较对象的最大值。

    package com.ikos.web;

    import java.util.Arrays;

    class Person {
    // 比较三个值并返回最大值
    public static <T extends Comparable<T>> T maximum(T x, T y, T z)
    {
    T max = x; // 假设x是初始最大值
    if ( y.compareTo( max ) > 0 ){
    max = y; //y 更大
    }
    if ( z.compareTo( max ) > 0 ){
    max = z; // 现在 z 更大
    }
    return max; // 返回最大对象
    }
    public static void main(String[] args) {
    System.out.printf( "%d, %d 和 %d 中最大的数为 %d ",
    3, 4, 5, maximum( 3, 4, 5 ) );
    System.out.printf( "%s, %s 和 %s 中最大的数为 %s ","abc",
    "zabc", "orange", maximum( "abc", "zabc", "orange" ) );
    }
    }

    结果输出:

    3, 4 和 5 中最大的数为 5

    abc, zabc 和 orange 中最大的数为 zabc

    总结

    Comparable和Comparator的区别:

    • java.lang.Comparable:在类定义的时候,可以实现好的接口,里面有compareTo这个方法需要实现。
    • java.util.Comparator:是挽救的比较接口,需要单独定义一个比较类,里面有compare比较方法。

    在更多情况下我们使用比较多的还是Comparable接口,在实际开发过程中的话,其实两者使用都比较少。



    佛语:我本求心不求佛,了知三界空无物,若欲求佛但求心,只这心心心是佛
  • 相关阅读:
    Linux Shell基础 单引号、双引号、反引号、小括号和大括号
    Linux Shell基础 通配符
    Linux Shell基础 管道符和grep命令
    Linux Shell基础 多个命令中的分号(;)、与(&&) 、 或(||)
    Linux Shell基础 Shell的输入重定向和输出重定向
    Linux Shell基础 Bash常见命令 history、alias命令以及常用快捷键
    Linux Shell基础 Bash常见命令 echo命令
    Linux Shell基础 Shell基本知识
    Linux文件系统管理 swap分区及作用
    《Hadoop权威指南 第4版》
  • 原文地址:https://www.cnblogs.com/wanglijun/p/14813775.html
Copyright © 2011-2022 走看看