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{
-
-
-
-
-
public
static
void
main(String[]args){
-
-
Employee[]staff=
new
Employee[
3
];
-
staff[
0
]=
new
Employee(
"harryHacker"
,
35000
);
-
staff[
1
]=
new
Employee(
"carlcracke"
,
75000
);
-
staff[
2
]=
new
Employee(
"tonyTester"
,
38000
);
-
-
Arrays.sort(staff);
-
-
-
-
-
-
-
for
(Employeee:staff)
-
System.out.println(
"id="
+e.getId()+
"name="
+e.getName()+
-
".salary="
+e.getSalary());
-
}
-
-
}
-
-
-
-
-
class
Employee
implements
Comparable<Employee>
-
{
-
public
Employee(Stringn,
double
s)
-
{
-
name=n;
-
salary=s;
-
RandomID=
new
Random();
-
id=ID.nextInt(
10000000
);
-
}
-
public
int
getId()
-
{
-
return
id;
-
}
-
public
StringgetName()
-
{
-
return
name;
-
}
-
-
public
double
getSalary()
-
{
-
return
salary;
-
}
-
-
public
void
raiseSalary(
double
byPercent)
-
{
-
double
raise=salary*byPercent/
100
;
-
salary+=raise;
-
}
-
-
public
int
compareTo(Employeeother)
-
{
-
if
(id<other.id)
-
return
-
1
;
-
if
(id>other.id)
-
return
1
;
-
return
0
;
-
}
-
private
int
id;
-
private
Stringname;
-
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);
}
}
分享到:
相关推荐
java通过Comparable接口实现字符串比较大小排序的简单实例
通过简单的例子初步了解Comparable和Comparator的使用,注释很详细
一般来说,任何实现 Comparable 接口和违背此条件的类都应该清楚地指出这一事实。推荐如此阐述:“注意:此类具有与 equals 不一致的自然排序。” 参数: o - 要比较的对象。 返回: 负整数、零或正整数,根据此...
下面小编就为大家带来一篇java中实现Comparable接口实现自定义排序的示例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
主要介绍了java 实现Comparable接口排序,升序、降序、倒叙,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
java排序Comparator和Comparable
本文要来详细分析一下Java中Comparable和Comparator接口的区别,两者都有比较的功能,那么究竟有什么区别呢,感兴趣的Java开发者继续看下去吧
000000_【课程介绍 —— 写在前面的话】_Java学习概述笔记.pdf 010101_【第1章:JAVA概述及开发环境搭建】_JAVA发展概述笔记.pdf 010102_【第1章:JAVA概述及开发环境搭建】_Java开发环境搭建笔记.pdf 010201_【第2...
comparator接口与Comparable接口的区别
Java-中的-Comparator-和-Comparable.md
Java8HashMap键与Comparable接口编程开发技术共3页.pdf.zip
Java中Comparable和Comparator的区别共3页.pdf.zip
【IT十八掌徐培成】Java基础第12天-02.TreeSet实现与Comparable接口.zip
java.lang.Comparable和java.util.Comparator是两个容易混淆的接口,两者都带有比较的意思,那么两个接口到底有什么区别,分别在什么情况下使用呢? Comparable Comparable是java.lang包下面的接口,lang包下面可以...
java的Comparator和Comparable
1.10 Java中Comparable和Comparator实现对象比较 1.11 Java中的JNDI (Java命名与目录接口) 1.12 Java事件处理机制与“恋爱关系” 1.13 Java代码优化编程 1.14 Java数组浅析 。。。。。。
Comparable的用法1---马克-to-win java视频的详细描述
当且仅当要使用的对象实现Comparable接口时,我们也可以创建不带Comparator对象的SortedList。 用法 我们将像创建Java中的任何ArrayList一样创建SortedList: SortedList sortedlist = new SortedList(comparator); ...
第5 版 清华大学出版社 “SCJP学习指南” 人民邮电出版社 “Java 编程思想” 第3版 机械工业出版社 教学内容和要求 知识点 重要程度 使用频度 难度 Java 入门 高 中 易 变量和运算符 高 ...