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