### 1\. Comparable
~~~
package java.lang;
import java.util.*;
public interface Comparable<T> {
? ?public int compareTo(T o);
}
~~~
說明:
Comparable 是排序接口。若一個類實現了Comparable接口,則該類可以支持排序。 假設現在存在實現Comparable接口的類的實例的List列表(或數組),則該List列表(或數組)可以通過?Collections.sort(或 Arrays.sort)進行排序。
假設我們通過 x.compareTo(y) 來“比較x和y的大小”。若返回“負數”,意味著“x比y小”;返回“零”,意味著“x等于y”;返回“正數”,意味著“x大于y”。
舉例:
~~~
package com.qunar.test;
/**
* Created by xiaosi on 16-3-7.
*/
public class Student implements Comparable<Student>{
? ?private String name;
? ?private int age;
? ?public Student(String name, int age) {
? ? ? ?this.name = name;
? ? ? ?this.age = age;
? ?}
? ?public String getName() {
? ? ? ?return name;
? ?}
? ?public void setName(String name) {
? ? ? ?this.name = name;
? ?}
? ?public int getAge() {
? ? ? ?return age;
? ?}
? ?public void setAge(int age) {
? ? ? ?this.age = age;
? ?}
? ?@Override
? ?public int compareTo(Student stu) {
? ? ? ?if(age == stu.getAge()){
? ? ? ? ? ?return name.compareTo(stu.getName());
? ? ? ?}//if
? ? ? ?else if(age > stu.getAge()){
? ? ? ? ? ?return 1;
? ? ? ?}
? ? ? ?return -1;
? ?}
}
~~~
~~~
? ? ? ?List<Student> stus = new ArrayList<Student>();
? ? ? ?stus.add(new Student("xiaosi",24));
? ? ? ?stus.add(new Student("sunny",24));
? ? ? ?stus.add(new Student("yoona",21));
? ? ? ?stus.add(new Student("kim",27));
? ? ? ?Collections.sort(stus);
? ? ? ?for(Student stu : stus){
? ? ? ? ? ?System.out.println("age" + stu.getAge() + " ? name->" + stu.getName());
? ? ? ?}
~~~
以上實例實現的功能是:按student的age排序,如果年齡相同,則按name排序。
### 2\. Comparator
~~~
package java.util;
public interface Comparator<T> {
? ?int compare(T o1, T o2);
? ?boolean equals(Object obj);
}
~~~
說明:
若一個類本身不支持排序,并且沒有實現Comparable接口。那么我們可以建立一個該類的比較器來進行排序。這個比較器只需要實現Comparator接口即可。我們可以通過比較器,然后通過該比較器對類進行排序。
舉例:
~~~
package com.qunar.test;
/**
* Created by xiaosi on 16-3-7.
*/
public class Teacher {
? ?private String name;
? ?private int age;
? ?public Teacher(String name, int age) {
? ? ? ?this.name = name;
? ? ? ?this.age = age;
? ?}
? ?public String getName() {
? ? ? ?return name;
? ?}
? ?public void setName(String name) {
? ? ? ?this.name = name;
? ?}
? ?public int getAge() {
? ? ? ?return age;
? ?}
? ?public void setAge(int age) {
? ? ? ?this.age = age;
? ?}
}
~~~
比較器:
~~~
package com.qunar.test;
import java.util.Comparator;
/**
* Created by xiaosi on 16-3-7.
* Teacher比較器
*/
public class TeacherComparator implements Comparator<Teacher>{
? ?@Override
? ?public int compare(Teacher o1, Teacher o2) {
? ? ? ?if(o1.getAge() == o2.getAge()){
? ? ? ? ? ?return o1.getName().compareTo(o2.getName());
? ? ? ?}//if
? ? ? ?else if(o1.getAge() > o2.getAge()){
? ? ? ? ? ?return 1;
? ? ? ?}
? ? ? ?return -1;
? ?}
}
~~~
~~~
? ? ? ?List<Teacher> teachers = new ArrayList<Teacher>();
? ? ? ?teachers.add(new Teacher("xiaosi",24));
? ? ? ?teachers.add(new Teacher("sunny",24));
? ? ? ?teachers.add(new Teacher("yoona",21));
? ? ? ?teachers.add(new Teacher("kim",27));
? ? ? ?Collections.sort(teachers,new TeacherComparator());
? ? ? ?for(Teacher te : teachers){
? ? ? ? ? ?System.out.println("age" + te.getAge() + " ? name->" + te.getName());
? ? ? ?}
~~~
### 3\. 比較
Comparable?是一個對象本身就已經支持自比較所需要實現的接口(如 String、Integer 自己就可以完成比較大小操作)。?Comparator?是一個專用的比較器,當這個對象不支持自比較或者自比較函數不能滿足你的要求時,你可以寫一個比較器來完成兩個對象之間大小的比較。可以說一個是自己完成比較,一個是外部程序實現比較的差別而已。
用 Comparator 是策略模式(strategy design pattern),就是不改變對象自身,而用一個策略對象(strategy object)來改變它的行為。比如:你想對整數采用絕對值大小來排序,Integer 是不符合要求的,你不需要去修改 Integer 類(實際上你也不能這么做)去改變它的排序行為,只要使用一個實現了 Comparator 接口的對象來實現控制它的排序就行了。
Comparable使用:將比較方法寫到實體類內對外聲明所有比較規則統一按照這一種方式,代碼的通用性差,如果改變一種比較規則,代碼需要重寫
Comparator使用:這種方式的比較實現了實體和比較規則的解綁,實現的比較規則可以根據自己的業務需求調用對應的比較類
- 前言
- [Hibernate開發之路](1)Hibernate配置
- [Hibernate開發之路](2)Hibernate問題
- [Hibernate開發之路](3)基礎配置
- [Hibernate開發之路](4)ID生成策略
- [Hibernate開發之路](5)聯合主鍵
- [設計模式實踐之路](1)單例模式
- [Java]UDP通信的簡單例子
- [Java]套接字地址InetAddress講解
- [Java開發之路](1)final關鍵字
- [Java開發之路](2)Java字符串
- [Java開發之路](3)Java常用類
- [Java開發之路](4)String、StringBuffer與StringBuilder詳解
- [Java開發之路](5)異常詳解
- [Java開發之路](6)File類的使用
- [Java開發之路](7)RandomAccessFile類詳解
- [Java開發之路](8)輸入流和輸出流
- [Java開發之路](9)對象序列化與反序列化
- [Java開發之路](10)DOM解析XML文檔
- [Java開發之路](11)SAX解析XML文檔
- [Java開發之路](12)JDOM和DOM4J解析XML文檔
- [Java開發之路](14)反射機制
- [Java開發之路](15)注解
- [Java開發之路](16)學習log4j日志
- [Java開發之路](18)關于Class.getResource和ClassLoader.getResource的路徑問題
- [Java開發之路](19)Long緩存問題
- [Java開發之路](20)try-with-resource 異常聲明
- [Java開發之路](21)Comparator與Comparable
- [Java]Java工程師成神之路
- [細說Java](1)圖說字符串的不變性
- [細說Java](2)Java中字符串為什么是不可變的
- [細說Java](3)創建字符串是使用&quot; &quot;還是構造函數?