版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_18948359/article/details/85213272
Comparable
CompareTo() 在我们使用 String 类的时候就遇到过(用于比较字符串顺序),Java 中很多类都有 CompareTo() 方法,这些类的 CompareTo() 方法都源于一个接口 Comparable。所有想要具有比较功能的类,都建议实现这个接口,而非是自己定义这个功能,这是面向对象的概念(将具有相同功能的事物抽象到一个共同的类或接口)。
源码定义:
public interface Comparable<T>{
// 比较此对象与指定对象的顺序。O为要比较的对象
// 返回值一般为:1(大于)、0(等于)、-1(小于)
public int compareTo(T o);
}
实现此接口的对象列表(和数组)可以通过 Collections.sort(或者 Arrays.sort)来进行排序。
import java.util.Arrays;
class Book implements Comparable<Book>{ // 实现比较
private String title;
private double price;
public Book(String title, double price) {
this.title = title;
this.price = price;
}
@Override
public String toString() {
return "书名:《" + this.title + "》,价格:" + this.price + "元。";
}
/**
* 覆写 compareTo 方法
*/
@Override
public int compareTo(Book o) {
if (this.price > o.price) {
return 1;
} else if (this.price < o.price) {
return -1;
} else {
return 0;
}
}
}
public class ComparableTest {
public static void main(String[] args) {
// 新建一个 book 列表
Book books[] = new Book[] {
new Book("Java从入门到精通", 79.6),
new Book("Oracle从入门到精通", 88.6),
new Book("Android从入门到精通", 66.9) };
// 使用 Arrays.sort() 方法排序,compareTo() 方法由 Arrays.sort() 自动调用
Arrays.sort(books);
System.out.println(Arrays.toString(books));
// [书名:《Android从入门到精通》,价格:66.9元。, 书名:《Java从入门到精通》,价格:79.6元。, 书名:《Oracle从入门到精通》,价格:88.6元。]
}
}
Comparator
Comparator(在 java.util 包中,是一个函数式接口) 也是比较器接口。和 Comparable 接口的区别在于,Comparable 在定义类的时候已经实现了这个接口的方法,但是如果在设计初期,并没有安排此类对象数组的排序,而后又需要实现对象数组的排序,就可以使用 Comparator。
源码定义:
package java.util;
public interface Comparator<T> {
int compare(T o1, T o2);
boolean equals(Object obj);
}
- 一个类要实现Comparator接口:它一定要实现compareTo(T o1, T o2) 函数,但可以不实现 equals(Object obj) 函数。
- 任何类,默认都是已经实现了equals(Object obj)的。 Java中的一切类都是继承于java.lang.Object,在Object.java中实现了equals(Object obj)函数;所以不必实现改方法
- int compare(T o1, T o2) 是“比较o1和o2的大小”。返回“负数”,意味着“o1比o2小”;返回“零”,意味着“o1等于o2”;返回“正数”,意味着“o1大于o2”
import java.util.Arrays;
import java.util.Comparator;
class Book {
private String title;
private double price;
public Book(String title, double price) {
this.title = title;
this.price = price;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
@Override
public String toString() {
return "书名:《" + this.title + "》价格:" + this.price + "元。";
}
}
class BookComparator implements Comparator<Book> {
@Override
public int compare(Book o1, Book o2) {
if (o1.getPrice() > o2.getPrice()) {
return 1;
} else if (o1.getPrice() < o2.getPrice()) {
return -1;
} else {
return 0;
}
}
}
public class Demo {
public static void main(String[] args) {
Book books[] = new Book[] {
new Book("MySQL", 55.8),
new Book("Androis", 50.7),
new Book("Oracle", 55.7),
new Book("Java", 48.8),
new Book("JSP", 43.7) };
Arrays.sort(books, new BookComparator());
for (Book book : books) {
System.out.println(book);
}
}
}
控制台输出:
书名:《JSP》价格:43.7元。
书名:《Java》价格:48.8元。
书名:《Androis》价格:50.7元。
书名:《Oracle》价格:55.7元。
书名:《MySQL》价格:55.8元。
Comparable 和 Comparator 的区别?
- 如果对象数组需要排序,就必须要设置排序规则,可以使用 Comparable 和 Comparator接口实现。
- java.lang.Comparable 是在一个类定义的时候实现好的接口,这样本来的对象数组就可以进行排序,在 Comparable 接口下定义下有一个 ComparableTo() 方法
- java.util.Comparator 是专门定义一个指定类的比较规则,属于挽救的比较操作,里面有两个方法,compare()、equals() 方法。