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接口,就表明它的实例具有内在 ...
随机推荐
- 树莓派(4B)Linux + .Net Core嵌入式-HelloWorld(二)
一.新建.Net Core项目 新建.Net Core3.0的控制台应用,代码如下 namespace Demo { class Program { static void Main(string[] ...
- Python的字符串编码
本文用实验详细地演示了Python2和Python3在字符串编码上的区别. 在Python2中,字符串字面量对应于8位的字符或面向字节编码的字节字面量.这些字符串的一个重要限制是它们无法完全地支持国际 ...
- PHP array_slice
1.函数的作用:返回数组中的部分区间的元素 2.函数的参数: @params array $array @params int $offset @params int $l ...
- Cocos2d-x 学习笔记(11.3) JumpBy JumpTo
1. JumpBy JumpTo JumpBy,边跳边平移,不只做垂直向上的抛物动作,同时还在向终点平移.JumpTo是JumpBy的子类. 1.1 成员变量 create方法 JumpBy: Vec ...
- springboot Jar包 部署到Linux服务器运行脚本
1.jar包同级目录 , 如下: #!/bin/sh RESOURCE_NAME=demo.jar tpid=`ps -ef|grep $RESOURCE_NAME|grep -v grep|grep ...
- comparator接口实现时,只需要实现 int compare(T o1, T o2)方法?
从Comparator接口的源码,可以看到Comparator接口中的方法有三类: 1 普通接口方法 2 default方法 3 static方法 其中default方法和static方法 是java ...
- SDRAM
环境:STM32F769discovery板 SDRAM芯片:用的MT48LC4M32B2B5-6A 16Mbyte (sdram和flash一般标的容量都是bit) 硬件图: 第一步 配置FM ...
- windows 系统对应的内核版本和自带 iis 版本
Windows 10 10.0* Windows Server 2016 10.0* Windows 8.1 6.3* Windows Server 2012 R2 6.3* Windows 8 6. ...
- Js极客之路 - 优化操作(性能优化)
1.因为每次For循环都会计算一次arr.length,所以有必要存储数组长度以减少计算.针对这篇文章(http://www.crimx.com/2015/04/21/should-array-len ...
- Arduino学习笔记① 初识Arduino
1.前言 近段时间,博主陆续更新了ESP8266学习笔记,主要开发平台是Arduino.但是,对于很多无基础的初学者来说,甚至不了解Arduino是什么.因此,博主决定加入一个Arduino学 ...