Java中Comparable接口与Comparator比较器的理解

哥哥的瞎扯:

代码之旅中,很多时候都需要比较,在Java中,若直接对数字int型登字符char大数据类型的集合比较,可以 Collections.sort(),对集合中的元素比较。

public class Sort {
    public static void main(String[] args) {
        List numbers = Arrays.asList(10, 2, 3, 1, 9, 15, 4);//元素为基本的数据类型
        Collections.sort(numbers);//直接用Collection的方法对集合排序
        System.out.println(numbers);
    }
}

若排序的是一个对象,比如一个猫一狗,不能直接比较,这时候就要用到comparable接口了。要实现这个接口即让类继承这个接口,在类中改写public int compareTo(Object o)方法,就可以用Collection.sort对该对象集合进行排序了。

class Student implements Comparable{//该学生类继承comparable接口
    private String name;
    private int age;
    Student(String name,int age){
        this.name=name;
        this.age=age;
    }
    public String toString() {
        return String.format("Student(%s,%d)", name,age);
    }
    public int compareTo(Object o)//重写该方法
    {
        Student a = (Student) o;
        return this.age-a.age;
    }
}
public class StudentTest {
    public static void main(String[] args)
    {
        List student = Arrays.asList(
                    new Student("王一",12),
                    new Student("陈五",23),
                    new Student("李四",22));
        Collections.sort(student);//就可以直接进行类内比较
        System.out.println(student);
    }

}

对于compareTo方法中函数返回值对整型:

  • 返回值:1 this.对象后移
  • 返回值:0 this.对象不动
  • 返回值:-1 this.对象前移

那现在看来Comparator比较器又有什么用处,它能不用修改对象类而进行之自定义排序,实现方法就是在类外再做一个比较器的类,重写comparable()方法,之后再调用Collection.sort(集合,比较器)就可以类外排序了吖。

package javaspace;

import java.util.*;

class Student implements Comparable{
	private String name;
	private int age;
	Student(String name,int age){
		this.name=name;
		this.age=age;
	}
	public String getName() {
		return this.name;
	}
	public String toString() {
        return String.format("Student(%s,%d)", name,age);
    }
	public int compareTo(Object o)
	{
		Student a = (Student) o;
		return this.age-a.age;
	}
}
class NameComparator implements Comparator{//设置比较器,自定义比较方法。
    public int compare(Object str1, Object str2) {
        Student	s1=(Student)str1;
    	Student s2=(Student)str2;
        return s1.getName().compareTo(s2.getName());
    }
} 
public class StudentTest {
	public static void main(String[] args)
	{
		List student = Arrays.asList(
					new Student("c",12),
					new Student("b",23),
					new Student("a",22));
		Collections.sort(student,new NameComparator());//排序时传入比较器
		System.out.println(student);
	}

}

Comparator可以看成一种算法的实现,将算法和数据分离,Comparator也可以在下面两种环境下使用:

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

花哥哥严肃说:

所学的知识均从课本,课外读物,网上收集资料,如果哪有侵权惹到您不开心丫,此外还有我也是小白,如果哪有认识不对的地方系统您抽我一耳光说我哪错了,联系企鹅号:184820911,有哪不明白或没事都可以找我,陪聊,陪吃不陪睡。

发布了28 篇原创文章 · 获赞 34 · 访问量 6076

猜你喜欢

转载自blog.csdn.net/L184820911/article/details/89358183
今日推荐