Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 264|回复: 0

[默认分类] 【Java学习笔记】Comparable接口的实现和使用

[复制链接]
  • TA的每日心情
    开心
    2021-12-13 21:45
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    发表于 2018-7-11 18:39:13 | 显示全部楼层 |阅读模式
    作者:gnuhpc
    出处:http://www.cnblogs.com/gnuhpc/
    1.什么是Comparable接口
    此接口强行对实现它的每个类的对象进行整体排序。此排序被称为该类的自然排序 ,类的 compareTo 方法被称为它的自然比较方法 。实现此接口的对象列表(和数组)可以通过 Collections.sort (和 Arrays.sort )进行自动排序。实现此接口的对象可以用作有序映射表中的键或有序集合中的元素,无需指定比较器。 强烈推荐(虽然不是必需的)使自然排序与 equals 一致。所谓与equals一致是指对于类 C 的每一个 e1 和 e2 来说,当且仅当 (e1.compareTo((Object)e2) == 0) 与e1.equals((Object)e2) 具有相同的布尔值时,类 C 的自然排序才叫做与 equals 一致
    2.实现什么方法
    1. int compareTo(T o)比较此对象与指定对象的顺序。如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数。
    2. 强烈推荐 (x.compareTo(y)==0) == (x.equals(y)) 这种做法,但不是 严格要求这样做。一般来说,任何实现 Comparable 接口和违背此条件的类都应该清楚地指出这一事实。推荐如此阐述:“注意:此类具有与 equals 不一致的自然排序。”
    3. 参数:
    4.        o - 要比较的对象。
    5. 返回:
    复制代码
    1.         负整数、零或正整数,根据此对象是小于、等于还是大于指定对象。
    2. 抛出:
    复制代码
    1.         ClassCastException - 如果指定对象的类型不允许它与此对象进行比较。
    复制代码

      


    3.实例
    import java.util.*;   

    public class EmployeeSortTest {   
      
    /**
          * @param args
          */
    public static void main(String[] args) {   
    // TODO Auto-generated method stub
             Employee[] staff =  new Employee[ 3 ];   
             staff[ 0 ] =  new Employee( "harry Hacker" , 35000 );   
             staff[ 1 ] =  new Employee( "carl cracke" , 75000 );   
             staff[ 2 ] =  new Employee( "tony Tester" , 38000 );   
      
             Arrays.sort(staff); //sort方法可以实现对对象数组排序,但是必须实现 Comparable接口
    /*Comparable接口原型为:
                                 * public interface Comparable<T>
                                 * {
                                 *      int compareTo(T other);//接口的中方法自动属于public方法
                                 * }
                                 */
    for (Employee e: staff)   
                 System.out.println( "id=" +e.getId()+ "  name=" +e.getName()+   
    ".salary=" +e.getSalary());   
         }   
      
    }   
    /*
      * 因为要实现对Employee对象的排序,所以在Employee类中要实现Comparable接口,
      * 也就是要实现comepareTo()方法
      */
    class Employee  implements Comparable<Employee>   
    {   
    public Employee(String n, double s)   
         {   
             name = n;   
             salary = s;   
             Random ID =  new Random();   
             id = ID.nextInt( 10000000 );   
         }   
    public int getId()   
         {   
    return id;   
         }   
    public String getName()   
         {   
    return name;   
         }   
      
    public double getSalary()   
         {   
    return salary;   
         }   
      
    public void raiseSalary( double byPercent)   
         {   
    double raise  = salary *byPercent/ 100 ;   
             salary+=raise;   
         }   
      
    public int compareTo(Employee other)   
         {   
    if (id<other.id) //这里比较的是什么 sort方法实现的就是按照此比较的东西从小到大排列
    return - 1 ;   
    if (id>other.id)   
    return 1 ;   
    return 0 ;   
         }   
    private int id;   
    private String name;   
    private double salary;   
    }

    4.与Comparator的区别
    Comparator位于包java.util下,而Comparable位于包java.lang下,Comparable接口将比较代码嵌入自身类中,而后者在一个独立的类中实现比较。 如果类的设计师没有考虑到Compare的问题而没有实现Comparable接口,可以通过  Comparator来实现比较算法进行排序,并且为了使用不同的排序标准做准备,比如:升序、降序。
    我们看一个Comparator的例子:
    import java.util.TreeSet;
    import java.util.Comparator;
    class NumComparator implements Comparator<NameTag> {
        public int compare (NameTag left,NameTag right) {
            return(left.getNumber() - right.getNumber());
        }
    }
    public class CollectionNine {
        public static void main(String arg[]) {
            new CollectionNine();
        }
        CollectionNine() {
            NumComparator comparator = new NumComparator();
            TreeSet<NameTag> set = new TreeSet<NameTag>(comparator);

            set.add(new NameTag("Agamemnon",300));
            set.add(new NameTag("Cato",400));
            set.add(new NameTag("Plato",100));
            set.add(new NameTag("Zeno",200));
            set.add(new NameTag("Archimedes",500));
            for(NameTag tag : set)
                System.out.println(tag);
        }
    }
    作者:gnuhpc
    出处:http://www.cnblogs.com/gnuhpc/
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-3-28 16:34 , Processed in 0.363359 second(s), 46 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表