java.lang.Comparable 接口定义的 compareTo() 方法用于提供对其实现类的对象进行整体排序所需要的比较逻辑。
实现类基于 compareTo() 方法的排序被称为自然排序。而 compareTo() 方法的排序被称为它的自然排序。具体的排序原则可由实现类根据需要而定。用户在重写 compareTo() 方法以定制比较逻辑时,需要确保其余等价性判断方法 equals() 保持一致,即 e1.equals((Object)e2) 和 e1.compareTo((Object)e2)==0 具有相同的值,这样的话我们就称自然顺序就和 equals 一致。
这个接口有什么用呢?
如果一个数组中的对象实现了 Compareable 接口,则对这个数组进行排序非常简单: Arrays.sort(); 如果 List 实现了该接口的话 , 我们就可以调用 Collections.sort 或者 Arrays 方法给他们排序。实际上 Java 平台库中的所有值类 (value classes) 都实现了 Compareable 接口。
Comparable 接口只有一个方法 compareTo(Object obj)
其中
this < obj 返回负
this = obj 返回 0
this > obj 返回正
即将当前这个对象与指定的对象进行顺序比较,当该对象小于、等于或大于指定对象时,分别返回一个负整数、 0 或正整数,如果无法进行比较,则抛出 ClassCastException 异常。
其实,有两种方式可以进行集合排序 :
1. 集合中对象的所属类实现了 java.lang.Comparable 接口
2. 为集合指定比较器 java.lang.Comparator 的实现类
Comparator , Comparable 接口的区别是:
comparable 是通用的接口,用户可以实现它来完成自己特定的比较,而 comparator 可以看成一种算法的实现,在需要容器集合 collection 需要比较功能的时候,来指定这个比较器,这可以看出一种设计模式,将算法和数据分离,就像 C++ STL 中的函数对象一样。
前者应该比较固定,和一个具体类相绑定,而后者比较灵活,它可以被用于各个需要比较功能的类使用。可以说前者属于“静态绑定”,而后者可以“动态绑定”。
一个类实现了 Camparable 接口表明这个类的对象之间是可以相互比较的。如果用数学语言描述的话就是这个类的对象组成的集合中存在一个全序。这样,这个类对象组成的集合就可以使用 Sort 方法排序了。
而 Comparator 的作用有两个:
1. 如果类的设计师没有考虑到 Compare 的问题而没有实现 Comparable 接口,可以通过 Comparator 来实现比较算法进行排序
2. 为了使用不同的排序标准做准备,比如:升序、降序或其他什么序
例如: Person.java 、 TestComparable.java
(1) Person.java
public class Person implements java.lang.Comparable{
private final int id;
private String name;
private int age;
public Person(int id,String name,int age){
this.id = id;
this.name = name;
this.age = age;
}
public int getId(){
return id;
}
public void setName(String name){
this.name = name;
}
public String getName(){
return name;
}
public void setAge(int age){
this.age = age;
}
public int getAge(){
return age;
}
public String toString(){
return "Id: " + id + "\tName: " + name + "\tAge: " + age;
}
@Override
public int compareTo(Object o){ // 实现 Comparable 接口的抽象方法,定义排序规则
Person p = (Person)o;
return this.id - p.id; // 升序排列,反之降序
}
@Override
public boolean equals(Object o){ //equals
boolean flag = false;
if(o instanceof Person){
if(this.id == ((Person)o).id)
flag = true;
}
return false;
}
}
import java.util.TreeSet;
import java.util.Iterator;
public class TestComparable{
public static void main(String[] args) {
TreeSet ts = new TreeSet();
ts.add(new Person(1003," 张三 ",15));
ts.add(new Person(1008," 李四 ",25));
ts.add(new Person(1015," 王五 ",73));
ts.add(new Person(1001," 赵六 ",49));
Iterator it = ts.iterator();
while(it.hasNext()){
Person employee = (Person)it.next();
System.out.println(employee);
}
}
}
运行结果:
Id: 1001 Name: 赵六 Age: 49
Id: 1003 Name: 张三 Age: 15
Id: 1008 Name: 李四 Age: 25
Id: 1015 Name: 王五 Age: 73
用TreeSet(Collection<? extends E> c) 构造实现
package com.jelly.set;
import java.util.Comparator;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
/**
* @author Jelly QQ136179492
*
*/
public class HashSetTest {
/**
* @param args
*/
public static void main(String[] args) {
Set set = new TreeSet(new MyComparator());
Person p1 = new Person(10);
Person p2 = new Person(22);
Person p3 = new Person(34);
Person p4 = new Person(45);
Person p5 = new Person(56);
set.add(p1);
set.add(p2);
set.add(p3);
set.add(p4);
set.add(p5);
for (Iterator iter = set.iterator(); iter.hasNext();) {
Person person = (Person) iter.next();
System.out.println(person.score);
}
}
}
class Person {
int score;
public Person(int score) {
this.score = score;
}
}
class MyComparator implements Comparator {
public int compare(Object o1, Object o2) {
Person s1 = (Person) o1;
Person s2 = (Person) o2;
return s1.score - s2.score;
}
}
分享到:
相关推荐
此外,`java.lang`包还定义了以下接口: 1. **Cloneable**: 标识一个类的实例可以被克隆。 2. **Comparable**: 接口定义了`compareTo()`方法,使得类的对象可以进行比较。 3. **Runnable**: 实现此接口的类的实例...
Java语言的核心库之一就是`java.lang`包,它包含了Java程序设计中最基础的类和接口,这些类和接口是每个Java应用程序必不可少的。由于`java.lang`包在编译时自动导入,因此程序员无需显式引入。本章将详细探讨这个...
Cloneable接口表示对象可以被克隆,Comparable接口则允许类的对象进行比较排序。 java.lang包还包含了一些与安全、线程和内存管理相关的类,如SecurityManager用于安全管理,Thread和ThreadGroup是线程相关的类,...
在Java编程语言中,`java.lang`包是所有Java程序的基础,因为它包含了许多核心类和接口,这些类和接口是编写任何Java应用程序所必需的。由于这个包是自动导入的,因此程序员无需在代码中显式地导入`java.lang`。 1....
Java编程语言中的java.lang包是一个核心包,它提供了Java语言运行时的基础类库,包含了Java程序运行的基本数据类型、异常处理类以及一些用于系统级别的工具类和接口。java.lang包中的类和接口不需要程序员显示地导入...
Comparable接口来源于java.lang包,它定义了一个方法`compareTo(T o)`。任何类如果实现了Comparable接口,就表明这个类的对象可以相互比较大小。例如,Java中的String、Integer等类都实现了Comparable接口,这使得...
接口回调 用哥德巴赫猜想来总结,哥德巴赫猜想就是要去输入一个偶数,输出这个偶数能被分解为哪两个质数的和,具体实现就是要去验证拆分出来的两个数是否为质数。 传统的方法我们需要先把验证质数的方法写好,然后...
(2)compareTo() 方法:Enum 实现了 java.lang.Comparable 接口,因此可以比较象与指定对象的顺序。Enum 中的 compareTo 返回的是两个枚举值的顺序之差。当然,前提是两个枚举值必须属于同一个枚举类,否则会抛出 ...
- `java.util.Comparator`和`java.lang.Comparable`:用于对象之间的比较。 这些主题共同构成了Java SE的基础,是理解和开发Java应用程序的关键。通过学习这些概念,开发者能够创建安全、高效和可维护的代码。
**Comparable接口** 是Java基础语言包`java.lang`的一部分,它定义了一个单一的方法`compareTo(T o)`。任何实现了Comparable接口的类都需要重写这个方法,以定义类实例之间的比较逻辑。这种比较规则被称为自然排序...
- `Comparable`和`Comparator`接口常用于排序操作,实现了这两个接口的对象可以进行比较。 5. **异常处理**: - Java使用异常处理机制来处理运行时错误。异常类位于`java.lang.Throwable`及其子类,如`...
首先,`Comparable`接口是Java.lang包下的一个接口,它只有一个方法`compareTo(T o)`。任何类如果想要实现自然排序,即按照类定义的规则进行排序,都可以实现这个接口。例如,`String`类就实现了`Comparable`接口,...
Java API文档包含了Java类库中的大量类和接口,例如`java.lang`包下的基本类如`String`、`Integer`,以及`java.util`包中的集合类如`ArrayList`、`HashMap`。接口如`Comparable`和`Iterable`定义了通用的行为规范,...
Java API,全称为Java应用程序接口,是Java编程语言的核心组成部分,包含了各种类库、接口和异常,为开发者提供了丰富的功能,使得开发Java应用程序变得更加高效和便捷。Java API文档则是Java开发者的必备参考资料,...
11. **反射(Reflection)`java.lang.reflect`包**:允许程序在运行时检查和操作类、接口、字段和方法。 12. **泛型(Generics)**:自Java 5起引入,提高了代码类型安全性和重用性。 13. **模块系统(Module ...
Java源码学习3:java.lang.Comparable接口和java.util.Comparator接口 考虑到所有Number类的派生类都实现了Comparable接口,故而优先学习Comparable接口。 Comparable接口和Comparator接口是相似接口,需要对比下。
Java API中的类和接口被组织成不同的包,如`java.lang`、`java.util`、`java.io`等。`java.lang`包包含所有Java程序的基础类,如`Object`、`String`和`System`;`java.util`包提供了集合框架、日期时间等工具类;`...
Java API基础包括java.lang包中的基础类库,例如Object类、Math数学类、Comparable可比较接口、基本数据类型的包装类、String字符串类、Class类操作类和System系统类等。这些类库提供了Java语言的基础功能和工具。 ...