java常用库学习总结(二)Comparator 和 Comparable
1. 简述
首先,Comparator和Comparable都是用来实现Collection中元素的比较、排序的;
而且,对于只对Collection中元素的只含单一基本类型属性进行比较排序的已经有了固定的Collections.sort()方法(因为这个基本类型对象已经实现了Comparable接口);
所以对于非基本类型对象的排序,我们需要自己来实现该对象的Comparable接口,不过这种方法存在局限性因为它只能和单一对象绑定而且还需要重写源代码compareTo(),当然这并不是唯一的方法,一种更加灵活的方法是使用Comparator算法策略。
2.实例
- Comparator用法例子
class Student
{
public String name;
public int score;
public Student(String name,int score)
{
this.name=name;
this.score=score;
}
}
class StudentComparator implements Comparator {
public int compare(Student s1, Student s2) {
return s2.score-s1.score; //降序
//return s1.score-s2.score; //升序
}
}
Collections.sort( StudentList , new StudentComparator()) //可以对其排序
这里我一开始特别好奇compare()函数实现升序降序的内部原理,所以去小查了一番(详细内容看这里哦)。
简单概括来说,先找到需要排序的序列从首处开始是否连续有序序列(升序降序都ok,因为降序只要逆序一下就好了嘛),然后把后面的无序序列根据二分法依次插入前面的有序序列(大概是二分法的一种改进版)。
另外,从这篇文章中明白了另一点值得一提的是Comparator是一个接口,它包含两种方法
int compare(Object o1, Object o2);
boolean equals(Object obj);
要实现Comparator接口,可以只实现compare函数,因为任何类,默认都是已经实现了equals(Object obj)的。 Java中的一切类都是继承于java.lang.Object,在Object.java中实现了equals(Object obj)函数
public boolean equals(Object obj) {
return (this == obj);
}
- Comparable用法例子
class Student implements Comparable<Student>
{
public String name;
public int score;
public Student(String name,int score)
{
this.name=name;
this.score=score;
}
public int getScore() {
return score;
}
public int compareTo(Student s)
{
return this.score - s.getScore(); //升序
}
}
Collections.sort( StudentList) //可以对其排序