Java中Comparable和Comparator的比較

首先從翻譯上來說,Comparable是可比較的,修飾的是對象,所以當一個對象實現這個接口的時候,這個對象就變成可比較的對象了,需要實現的方法爲compareTo(T o)。Comparator是比較器,是一個名詞,當我們比較兩個對象的時候,標準是什麼呢?可以通過這個比較器Comparator來定義,需要實現的接口是compare(T o1, T o2),還有一個equals(Object obj)。

那麼,究竟怎麼比較和排序呢?

可以這樣理解,對於一個集合中的元素,比如學生對象集合,我們排序一般用學號,所以學生對象實現Comparable接口,並按學號比較即可;可是事情總會有特殊情況,在某一處,我們需要按學生姓名排序,怎麼辦呢,那就再寫一個比較器即可。

下面是個例子:

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class Example {

	public static void main(String[] args) {
		// String本來就是實現了Comparable接口
		List<String> list = new ArrayList<String>();
		list.add("1");
		list.add("3");
		list.add("2");
		// 本來插入的順序
		System.out.println(list);
		
		// 按照Comparable排序
		Collections.sort(list);
		System.out.println(list);
		
		// 按照自定義的Comparator排序
		Collections.sort(list, new Comparator<String>() {
			@Override
			public int compare(String s1, String s2) {
				return s2.compareTo(s1);
			}
		});
		System.out.println(list);
		
		System.out.println("---------------------");
		System.out.println("---------------------");
		
		List<Student> students = new ArrayList<Student>();
		students.add(new Student(1, "John"));
		students.add(new Student(3, "Smith"));
		students.add(new Student(2, "Lucy"));
		System.out.println(students);
		
		Collections.sort(students);
		System.out.println(students);
		
		Collections.sort(students, new Comparator<Student>() {
			@Override
			public int compare(Student s1, Student s2) {
				return s2.getNo() - s1.getNo();
			}
		});
		System.out.println(students);
	}
	
}

class Student implements Comparable<Student> {

	private int no;
	private String name;
	
	public Student(int no, String name) {
		this.no = no;
		this.name = name;
	}
	
	@Override
	public String toString() {
		return no + ":" + name;
	}
	
	@Override
	public int compareTo(Student s) {
		return this.no - s.no;
	}

	public int getNo() {
		return no;
	}
	public void setNo(int no) {
		this.no = no;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
}



發佈了26 篇原創文章 · 獲贊 3 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章