zoukankan      html  css  js  c++  java
  • java.lang.Comparable<T> 接口

    package java.lang;
    import java.util.*;
    public interface Comparable<T> {
      public int compareTo(T o);
    }

    1.什么是Comparable接口

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

    @Override
        public boolean equals(Object obj)
        {
            if (this == obj)
                return true;
            if (obj == null)
                return false;
            if (getClass() != obj.getClass())
                return false;
            EnvNode other = (EnvNode) obj;
            if (id == other.id && id > 0)
                return true;
            return false;
        }
    
        @Override
        public int hashCode()
        {
            return super.hashCode() + id;
        }
    
        @Override
        public int compareTo(EnvNode o)
        {
            return this.id - o.getId();
        }

    2.实现什么方法

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

    3.实例

    package com.lime.ibs.device.bean;
    /*
    * 因为要实现对EnvNode对象的排序,所以在EnvNode类中要实现Comparable接口,
    * 也就是要实现comepareTo()方法
    */
    public abstract class EnvNode implements Comparable<EnvNode>
    {
    
        private int id = 0;
        private int pid = 0; // 父id
        private String name = "";
        private String address = "";
    
        private String background = "";
        public String icon = "";
    
        private int connStatus = 1; // 0:未连接;1:连接正常
    
        public int getId() {
            return id;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        public int getPid() {
            return pid;
        }
    
        public void setPid(int pid) {
            this.pid = pid;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getBackground()
        {
            return background;
        }
    
        public void setBackground(String background)
        {
            this.background = background;
        }
    
        public String getAddress()
        {
            return address;
        }
    
        public void setAddress(String address)
        {
            this.address = address;
        }
    
        public int getConnStatus()
        {
            return connStatus;
        }
    
        public void setConnStatus(int connStatus)
        {
            this.connStatus = connStatus;
        }
    
        @Override
        public boolean equals(Object obj)
        {
            if (this == obj)
                return true;
            if (obj == null)
                return false;
            if (getClass() != obj.getClass())
                return false;
            EnvNode other = (EnvNode) obj;
            if (id == other.id && id > 0)
                return true;
            return false;
        }
    
        @Override
        public int hashCode()
        {
            return super.hashCode() + id;
        }
    
        @Override
        public int compareTo(EnvNode o)
        {
            return this.id - o.getId();
        }
    
        public String getIcon() {
            return icon;
        }
    
        public void setIcon(String icon) {
            this.icon = icon;
        }
    
    }

    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); 
        } 
    }
  • 相关阅读:
    微信小程序-默认选中状态
    微信小程序-翻页(优化)
    openLayers3 中实现多个Overlay
    2月的最后一天
    2月27日
    杂记--写于狂风乱作的夜晚
    安装部署程序
    superMap Object 属性查看的一点代码
    坚持不懈的学习吧,少年
    Windows API中几个函数的总结
  • 原文地址:https://www.cnblogs.com/ClassNotFoundException/p/6139936.html
Copyright © 2011-2022 走看看