Comparable和Comparator接口的区别

****

Comparable是排序接口

若一个类实现了Comparable接口,就意味着该类支持排序。实现了Comparable接口的类的对象的列表或数组可以通过Collections.sort或Arrays.sort进行自动排序。

此接口只有一个方法compare,比较此对象与指定对象的顺序,如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数。

public static class Student implements Comparable{
    	private String name;
    	private int grade;
		public Student(String name, int grade) {
			
			this.name = name;
			this.grade = grade;
		}
		public String getName() {
			return name;
		}
		public void setName(String name) {
			this.name = name;
		}
		public int getGrade() {
			return grade;
		}
		public void setGrade(int grade) {
			this.grade = grade;
		}
		@Override//重写 comparable的compareto()方法
		public int compareTo(Object o) {
			Student stu=(Student)o;
			int t=this.grade-stu.grade;
			return t==0?this.name.compareTo(stu.name):t;
		}

//有排序功能的总结

1.数组排序Arrays.sort(对象数组) 2.TreeSet自然排序 3.Collections.sort(对象集合)

****

Comparator是比较接口,我们如果需要控制某个类的次序,而该类本身不支持排序(即没有实现Comparable接口),那么我们就可以建立一个“该类的比较器”来进行排序,这个“比较器”只需要实现Comparator接口即可。也就是说,我们可以通过实现Comparator来新建一个比较器,然后通过这个比较器对类进行排序。

public class Homework {	
	
    public static void main(String[] args)  {
    	TreeSet<Student> ts=new TreeSet(new CompareByGrade());
    	//如果是对象数组的话 Arrays.sort(对象数组名,new 比较器());
    	ts.add(new Student("sunyucui", 99));
    	ts.add(new Student("tom", 88));
    	ts.add(new Student("rose", 88));
    	ts.add(new Student("sunyucui", 60));
    	ts.add(new Student("jerry", 17));
    	
    	Iterator<Student> it=ts.iterator();
    	while(it.hasNext()){
    		Student stu=(Student)it.next();
    		System.out.println(stu.name+": "+stu.grade);
    	}
    	
    
    }
    public static class Student{
    	private String name;
    	private int grade;
		public Student(String name, int grade) {
			
			this.name = name;
			this.grade = grade;
		}
		public String getName() {
			return name;
		}
		public void setName(String name) {
			this.name = name;
		}
		public int getGrade() {
			return grade;
		}
		public void setGrade(int grade) {
			this.grade = grade;
		}
		
		
    }
    // 新建一个“比较器”类
    static class CompareByGrade implements Comparator{
    	public int compare(Object o1, Object o2) {
			Student s1=(Student)o1;
			Student s2=(Student)o2;
			int t=s1.grade-s2.grade;
			return t==0?s1.name.compareTo(s2.name):t;
			//按照成绩排名,如果成绩一样就比较名字
		}
    }
}

*********

Comparable相当于“内部比较器”,而Comparator相当于“外部比较器”。

  两种方法各有优劣, 用Comparable 简单, 只要实现Comparable 接口的对象直接就成为一个可以比较的对象,但是需要修改源代码。 用Comparator 的好处是不需要修改源代码, 而是另外实现一个比较器, 当某个自定义的对象需要作比较的时候,把比较器和对象一起传递过去就可以比大小了, 并且在Comparator 里面用户可以自己实现复杂的可以通用的逻辑,使其可以匹配一些比较简单的对象,那样就可以节省很多重复劳动了。

猜你喜欢

转载自blog.csdn.net/weixin_41499217/article/details/85217886