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万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章