Comparable接口的实现和使用
1.什么是Comparable接口
此接口强行对实现它的每个类的对象进行整体排序。此排序被称为该类的自然排序 ,类的 compareTo 方法被称为它的自然比较方法 。实现此接口的对象列表(和数组)可以通过 Collections.sort (和 Arrays.sort )进行自动排序。实现此接口的对象可以用作有序映射表中的键或有序集合中的元素,无需指定比较器。 强烈推荐(虽然不是必需的)使自然排序与 equals 一致。所谓与equals一致是指对于类 C 的每一个 e1 和 e2 来说,当且仅当 (e1.compareTo((Object)e2) == 0) 与e1.equals((Object)e2) 具有相同的布尔值时,类 C 的自然排序才叫做与 equals 一致 。
2.实现什么方法
int compareTo(T o)
比较此对象与指定对象的顺序。如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数。
强烈推荐 (x.compareTo(y)==0) == (x.equals(y)) 这种做法,但不是 严格要求这样做。一般来说,任何实现 Comparable 接口和违背此条件的类都应该清楚地指出这一事实。
推荐如此阐述:“注意:此类具有与 equals 不一致的自然排序。”
参数:
o - 要比较的对象。
返回:
负整数、零或正整数,根据此对象是小于、等于还是大于指定对象。
抛出:
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);
}
}
Comparable接口的实现和使用的更多相关文章
- 12.Java中Comparable接口,Readable接口和Iterable接口
		1.Comparable接口 说明:可比较(可排序的) 例子:按照MyClass的y属性进行生序排序 class MyClass implements Comparable<MyClass> ... 
- java中的Comparable接口
		类对象之间比较"大小"往往是很有用的操作,比如让对象数组排序时,就需要依赖比较操作.对于不同的类有不同的语义.如Student类,比较2个学生对象可以比较他们的score分数来评判 ... 
- comparator接口与Comparable接口的区别
		1. Comparator 和 Comparable 相同的地方 他们都是java的一个接口, 并且是用来对自定义的class比较大小的, 什么是自定义class: 如 public class Pe ... 
- Comparable接口与Comparator接口的区别
		1. Comparator 和 Comparable 相同的地方 他们都是java的一个接口, 并且是用来对自定义的class比较大小的, 什么是自定义class: 如 public class Pe ... 
- Comparable接口
		java.util.Arrays类也可以对Object数组进行排序,但是要使用这种方法排序必须实现Comparable接口,此接口就是用于指定对象排序规则的. 设计一个学生类,成绩由高到低排序,成绩相 ... 
- Java集合中Comparator和Comparable接口的使用
		在Java集合中,如果要比较引用类型泛型的List,我们使用Comparator和Comparable两个接口. Comparable接口 -- 默认比较规则,可比较的 实现该接口表示:这个类的实例可 ... 
- Java中的Comparable接口和Comparator接口
		Comparator位于包java.util下,比较器,是在集合外部定义排序.Comparable位于包java.lang下,代表当前对象可比较的,是在集合内部实现排序. Comparable代表一个 ... 
- C#实现Comparable接口实现排序
		C#中,实现排序的方法有两种,即实现Comparable或Comparer接口,下面简单介绍实现Comparable接口实现排序功能. 实现Comparable接口需要实现CompareTo(obje ... 
- Java之Comparable接口和Comparator接口
		Comparable & Comparator 都是用来实现集合中元素的比较.排序的: Comparable 是在集合内部定义的方法实现的排序: Comparator 是在集合外部实现的排序: ... 
- 第12条:考虑实现Comparable接口
		CompareTo方法没有在Object中声明,它是Comparable接口中的唯一的方法,不但允许进行简单的等同性比较,而且允许执行顺序比较.类实现了Comparable接口,就表明它的实例具有内在 ... 
随机推荐
- 浅谈json web token及应用
			Json Web Token (JWT),是一个非常轻巧的规范,这个规范允许在网络应用环境间客户端和服务器间较安全的传递信息.该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO) ... 
- 小白学 Python(2):基础数据类型(上)
			人生苦短,我选Python 引言 前文传送门 小白学 Python(1):开篇 接触一门新的语言,肯定要先了解它的基础数据类型.啥?你问我为啥要先了解基础数据类型? 为了你的生命安全,还是乖乖听我 B ... 
- STM32串口IAP分享
			什么是IAP? IAP是In Application Programming的首字母缩写,IAP是用户自己的程序在运行过程中对User Flash的部分区域进行烧写,目的是为了在产品发布后可以方便地通 ... 
- Express框架的整体感知
			Express是基于node.js平台的快速.开放.极简的web开放框架,它的地位与作用有点类似于前端的jquery框架.它的英文官网地址为 http://expressjs.com,其对应的中文官网 ... 
- if-elif-else分支判断语句(附加continue和break)---举例说明
			一.分支循环语句: a=input("请输入一个五位数字") if(len(a)!=5): print("输入的数字不合格"); elif(a[0::]==a[ ... 
- netty源码解析(4.0)-26 ByteBuf内存池:PoolArena-PoolSubpage
			PoolChunk用来分配大于或等于一个page的内存,如果需要小于一个page的内存,需要先从PoolChunk中分配一个page,然后再把一个page切割成多个子页-subpage,最后把内存以s ... 
- JAVA nio 简单使用
			nio 模拟客户端和服务器互相通讯--传输一个int值,并且不断的+1: 服务器,单线程 public class Server { public static void main(String[] ... 
- @EnableTransactionalManager 发生了什么
			@EnableTransactionalManager 利用TransactionManagementConfigurationSelector 给容器中注入bean,导入2个组件: AutoProx ... 
- Kafka Manager安装部署及使用
			为了简化开发者和服务工程师维护Kafka集群的工作,yahoo构建了一个叫做Kafka管理器的基于Web工具,叫做 Kafka Manager.本文对其进行部署配置,并安装配置kafkatool对k ... 
- docker入门级详解
			Docker 1 docker安装 yum install docker [root@topcheer ~]# systemctl start docker [root@topcheer ~]# mk ... 
