求解Comparator跟Comparable

求解Comparator和Comparable
Comparator接口,实现此接口的类就是一个排序器,Arrays和Collections都能在sort()方法的参数中指明排序方式,即实现Comparator接口的类的示例。
User类:

public class User {

	private String name;
	private int age;
	
	public User(String name, int age) {
		this.name = name;
		this.age = age;
	}
	
	public String getName() {
		return name;
	}

	public int getAge() {
		return age;
	}

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

	public void setName(String name) {
		this.name = name;
	}

}

ComparatorUser类;
import java.util.Arrays;
import java.util.Comparator;

public class ComparatorUser implements Comparator<User> {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		User[] users = new User[] { new User("1", 15), new User("2", 19), new User("3", 17) };
		for(User user : users) {
			System.out.println(user.getName() + ":" + user.getAge());
		}
		Arrays.sort(users, new ComparatorUser());
		for(User user : users) {
			System.out.println(user.getName() + ":" + user.getAge());
		}
		
	}

	@Override
	public int compare(User user1, User user2) {
		return ((User) user1).getAge() - ((User) user2).getAge();
	}


}

结果:
1:15
2:19
3:17
1:15
3:17
2:19


这里的ComparatorUser就是一个排序器。只不过我将测试代码写在此类里边了。
写在外边的情况,User类不变,
ComparatorUser类:
import java.util.Comparator;

public class ComparatorUser implements Comparator<User> {

	@Override
	public int compare(User user1, User user2) {
		return ((User) user1).getAge() - ((User) user2).getAge();
	}

}

测试类:
import java.util.Arrays;

public class ComparatorTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		User[] users = new User[] { new User("jin", 18),
				new User("gui", 19), new User("jin", 15),
				new User("chao", 20) };
		for(User user : users) {
			System.out.println(user.getName() + ": " + user.getAge());
		}
		Arrays.sort(users, new ComparatorUser());
		for(User user : users) {
			System.out.println(user.getName() + ": " + user.getAge());
		}
	}

}

输出结果:
jin: 18
gui: 19
jin: 15
chao: 20
jin: 15
jin: 18
gui: 19
chao: 20




实现Comparable接口的类在进行排序时,就会默认对其用自身的排序机制进行排序。
import java.util.Arrays;


public class ComparableUser implements Comparable<ComparableUser> {
	
	private String name;
	private int age;
	
	public ComparableUser(String name, int age) {
		this.age = age;
		this.name = name;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

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

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		ComparableUser[] users = new ComparableUser[] { new ComparableUser("jin", 15), new ComparableUser("gui", 19), new ComparableUser("chao", 18), new ComparableUser("jin", 17) };
		for(ComparableUser user : users) {
			System.out.println(user.getName() + ":" + user.getAge());
		}
		Arrays.sort(users);
		for(ComparableUser user : users) {
			System.out.println(user.getName() + ":" + user.getAge());
		}
	}

	@Override
	public int compareTo(ComparableUser user) {
		if(this.name.compareTo(user.getName()) != 0) {
			return this.name.compareTo(user.getName());
		}
		return this.age - user.age;
	}

}

结果:
jin:15
gui:19
chao:18
jin:17
chao:18
gui:19
jin:15
jin:17


总结:
Comparator是排序器,是一种规则,
实现Comparable接口,就说明,某个类有自己定义的排序规则。
如果对已经实现Comparable的类进行指定排序器的话,编译就会出错。