java比较器的二种实现方式的区别

    java的比较器应用于很多场景,最常见的出泛型的排序或者是简单的排序。有二种实现方式,使用Comparable、Comparator哪一种符合具体的开发情形,还是要看二者的区别。从api上得知,一个类实现了Comparable接口则表明这个类的对象之间是可以相互比较的,这个类对象组成的集合就可以直接使用sort方法排序。Comparator可以看成一种算法的实现,将算法和数据分离,Comparator也可以在下面两种环境下使用:

1、类的设计师没有考虑到比较问题而没有实现Comparable,可以通过Comparator来实现排序而不必改变对象本身
2、可以使用多种排序标准,比如升序、降序等。

   总结下,个人偏爱第二种,因为数据和功能的解耦体现了MVC的精神,会产生一定的效益。具体看下代码体验。

 1.使用Comparator

public class MyRule implements Comparator<Student> {
	private String order;
	private String choice;

	public MyRule(String order, String choice) {
		this.order = order;
		this.choice = choice;
	}

	@Override
	public int compare(Student o1, Student o2) {
		if (order.isEmpty()) {
			System.out.println("order is empty");
			return 0;
		}
		if (choice.isEmpty()) {
			System.out.println("choice is empty");
			return 0;
		}
		// 降序
		if (order.equals("desc")) {
			if (choice.equals("age")) {
				return o2.getAge() - o1.getAge();
			} else if (choice.equals("score")) {
				return o2.getScore() - o1.getScore();
			} else {
				System.out.println("no such choice");
				return 0;
			}
		}
		// 升序
		else if (order.equals("asc")) {
			if (choice.equals("age")) {
				return o1.getAge() - o2.getAge();
			} else if (choice.equals("score")) {
				return o1.getScore() - o2.getScore();
			} else {
				System.out.println("no such choice");
				return 0;
			}
		} else {
			System.out.println("no such order");
			return 0;
		}
	}

}
public class Student {

	private int userId;
	private String username;
	private int age;
	private int score;

	public Student(int userId, String username, int age, int score) {
		this.userId = userId;
		this.username = username;
		this.age = age;
		this.score = score;
	}

	public int getUserId() {
		return userId;
	}

	public void setUserId(int userId) {
		this.userId = userId;
	}

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public int getAge() {
		return age;
	}

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

	public int getScore() {
		return score;
	}

	public void setScore(int score) {
		this.score = score;
	}

	@Override
	public String toString() {
		return "Student [userId=" + userId + ", username=" + username
				+ ", age=" + age + ", score=" + score + "]";
	}

}
public class SortDemo {

	public static void main(String[] args) throws Exception {
		List<Student> list = new ArrayList<Student>();
		list.add(new Student(1, "a", 26, 97));
		list.add(new Student(2, "b", 24, 80));
		list.add(new Student(3, "c", 28, 91));
		// 选择降序排列成绩
		MyRule mr = new MyRule("desc", "score");
		Collections.sort(list, mr);
		for (Student userInfo : list) {
			System.out.println(userInfo.toString());
		}
	}

}
2.使用Comparable

public class Person implements Comparable {
	private int userId;
	private String username;
	private int age;
	private int score;

	public Person(int userId, String username, int age, int score) {
		this.userId = userId;
		this.username = username;
		this.age = age;
		this.score = score;
	}

	public int getUserId() {
		return userId;
	}

	public void setUserId(int userId) {
		this.userId = userId;
	}

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public int getAge() {
		return age;
	}

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

	public int getScore() {
		return score;
	}

	public void setScore(int score) {
		this.score = score;
	}

	@Override
	public String toString() {
		return "Student [userId=" + userId + ", username=" + username
				+ ", age=" + age + ", score=" + score + "]";
	}

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

	public static void main(String[] args) {
		List<Person> data = new ArrayList<Person>();
		data.add(new Person(1, "xigua", 22, 59));
		data.add(new Person(2, "mugua", 32, 19));
		data.add(new Person(3, "donggua", 27, 27));
		Collections.sort(data);
		for (Person person : data) {
			System.out.println(person.toString());
		}
	}

}




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章