• compareTo返回值为-1 、 1 、 0 的排序问题


    1.什么是Comparable接口

    此接口强行对实现它的每个类的对象进行整体排序。此排序被称为该类的自然排序 ,类的 compareTo 方法被称为它的自然比较方法 。实现此接口的对象列表(和数组)可以通过 Collections.sort (和 Arrays.sort )进行自动排序。实现此接口的对象可以用作有序映射表中的键或有序集合中的元素,无需指定比较器。 强烈推荐(虽然不是必需的)使自然排序与 equals 一致。所谓与equals一致是指对于类 的每一个 e1和 e2 来说,当且仅当 (e1.compareTo((Object)e2) == 0) e1.equals((Object)e2) 具有相同的布尔值时,类 的自然排序才叫做与 equals 一致 。

    2.实现什么方法

    int compareTo(T o)
    比较此对象与指定对象的顺序。如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数。
    强烈推荐 (x.compareTo(y)==0) == (x.equals(y)) 这种做法,但不是 严格要求这样做。一般来说,任何实现 Comparable 接口和违背此条件的类都应该清楚地指出这一事实。推荐如此阐述:“注意:此类具有与 equals 不一致的自然排序。”
    参数: o - 要比较的对象。 返回:
            负整数、零或正整数,根据此对象是小于、等于还是大于指定对象。 
    抛出:
            ClassCastException - 如果指定对象的类型不允许它与此对象进行比较。

    3.实例

    复制代码
    package test1;
    
    public class Note<T> implements Comparable<Note<T>> {
    
        private T data; //数据
        private int weight; //权值
        private Note<T> left; //左孩子
        private Note<T> right; //右孩子
        
        public Note(T data,int weight){
            this.data=data;
            this.weight=weight;
        }
        
        @Override
        public String toString(){
            return "data="+this.data+",weitht="+this.weight;
        }    
        
        public T getData() {
            return data;
        }
        public void setData(T data) {
            this.data = data;
        }
    
        public int getWeight() {
            return weight;
        }
        public void setWeight(int weight) {
            this.weight = weight;
        }
    
        public Note<T> getLeft() {
            return left;
        }
        public void setLeft(Note<T> left) {
            this.left = left;
        }
    
        public Note<T> getRight() {
            return right;
        }
        public void setRight(Note<T> right) {
            this.right = right;
        }
        
        
        /**
         * 倒序排列。
         */
        @Override
        public int compareTo(Note<T> o) {
            if(o.weight>this.weight){
                return 1;
            }else if(o.weight<this.weight){
                return -1;
            }
            return 0;
        }
        /**
         * 升序排列
         */
    //    @Override
    //    public int compareTo(Note<T> o){
    //        if(this.weight>o.weight){
    //            return 1;
    //        }else if(this.weight<o.weight){
    //            return -1;
    //        }
    //        return 0;
    //    }
    复制代码

    Ps:(快速记忆法)当前对象与后一个对象进行比较,如果比较结果为1进行交换,其他不进行交换。

    当后一个对象比当前对象大,返回结果值为1时,前后交换,说明是倒序排列。

    当后一个对象比当前对象小,返回结果值为1时,前后交换,说明是升序排列。

  • 相关阅读:
    列表 查找元素二分查找
    文件的追加
    Syste.IO 类介绍
    Ctack堆栈
    判断文件是否存在(Exists)
    复杂排序
    元素出栈和入站
    HTML文档中meta标签的作用 Generator KEYWords DEscription Author httpequiv属性
    Page.ClientScript.RegisterClientScriptBlock 失效
    用户名只能由字母或者数字组成(用户控件与HTML控件)
  • 原文地址:https://www.cnblogs.com/shizhijie/p/7656869.html
Copyright © 2020-2023  润新知