Java基础类库之Comparable接口与Comparator接口

版权声明:本文为博主原创文章,未经博主允许不得转载。 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() 方法。

猜你喜欢

转载自blog.csdn.net/qq_18948359/article/details/85213272