Comparator和Comparable的用法和區別

       當需要排序的集合或數組不是單純的數字型時,通常可以使用Comparator或Comparable,以簡單的方式實現對象排序或自定義排序。
       Comparable是一個對象本身就已經支持自比較所需要實現的接口(如String、Integer、Float自己就可以完成比較大小操作)。
       Comparator是一個專用的比較器,當這個對象不支持自比較或者自比較函數不能滿足你的要求時,你可以寫一個比較器來完成兩個對象之間大小的比較。
       Comparable是通用的接口,用戶可以實現它來完成自己特定的比較,而comparator可以看成一種算法的實現,在需要容器集合collection需要比較功能的時候,來指定這個比較器,這是策略設計模式。
      換言之,Comparable比較固定,和一個具體類相綁定,而Comparator比較靈活,它可以被用於各個需要比較功能的類使用。
     Comparator的作用有兩個: 
  1. 如果類的設計師沒有考慮到Compare的問題而沒有實現Comparable接口,可以通過 Comparator來實現比較算法進行排序 ;

  2. 爲了使用不同的排序標準做準備,比如:升序、降序或其他什麼序。

      下面通過兩個例子分別用Comparable和Comparator實現對User對象中年齡排序。

      1.通過實現Comparable接口,根據User的年齡進行排序。 

import java.util.Arrays;

/**
 * @author Young
 * 
 */
public class User implements Comparable<User> {

	private String id;
	private int age;

	public User(String id, int age) {
		this.id = id;
		this.age = age;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((id == null) ? 0 : id.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		User other = (User) obj;
		if (id == null) {
			if (other.id != null)
				return false;
		} else if (!id.equals(other.id))
			return false;
		return true;
	}

	@Override
	public String toString() {
		return "User [id=" + id + ", age=" + age + "]";
	}


	@Override
	public int compareTo(User o) {
		return this.age - ((User) o).getAge();
	}

	/**
	 * 測試方法
	 */
	public static void main(String[] args) {
		User[] users = new User[] {
				new User("100", 25),
				new User("101", 20),
				new User("102", 21) };
		Arrays.sort(users);
		for (User user : users) {
			System.out.println(user.getId() + " " + user.getAge());
		}
	}
}
           2. 通過實現Comparator接口,根據User的年齡進行排序。
/**
 * @author Young
 * 
 */
public class User{

	private String id;
	private int age;

	public User(String id, int age) {
		this.id = id;
		this.age = age;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((id == null) ? 0 : id.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		User other = (User) obj;
		if (id == null) {
			if (other.id != null)
				return false;
		} else if (!id.equals(other.id))
			return false;
		return true;
	}

	@Override
	public String toString() {
		return "User [id=" + id + ", age=" + age + "]";
	}

}

import java.util.Arrays;  
import java.util.Comparator;  
  
/** 
 * @author Young
 *  
 */  
public class UserComparator implements Comparator<User> {  

	@Override
	public int compare(User o1, User o2) {
		return ((User) o1).getAge() - ((User) o2).getAge();
	}  
	
	/**
	 * 測試方法
	 */
	public static void main(String[] args) {
		User[] users = new User[] {
				new User("100", 25),
				new User("101", 20),
				new User("102", 21) };
		Arrays.sort(users,UserComparator);
		for (User user:users) {
			System.out.println(user.getId() + " " + user.getAge());
		}
	}
}  



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