目录
普通类型排序
1、Integer排序
实现类的代码如下,Integer实现了Comparable接口,实现了该接口的comparaTo
方法
public final class Integer extends Number implements Comparable<Integer> {
@override
public int compareTo(Integer anotherInteger) {
return compare(this.value, anotherInteger.value);
}
public static int compare(int x, int y) {
return (x < y) ? -1 : ((x == y) ? 0 : 1);
}
}
2、Character排序
实现类如下,Character实现了Comparable接口,重写了该接口的comparaTo
方法,通过比较字符的unicode
,比如a
为97,A
为65
public final class Character implements java.io.Serializable, Comparable<Character> {
public int compareTo(Character anotherCharacter) {
return compare(this.value, anotherCharacter.value);
}
public static int compare(char x, char y) {
return x - y;
}
}
3、String 排序
String
的排序规则为:
- 如果两个字符串的长度相等,那么从第一个字符比较,如果相等则比较下一个字符串,如果不相等则返回两个字符串的差值
- 如果字符串的长度不相等,则返回两个字符串的长度之差
public int compareTo(String anotherString) {
int len1 = value.length;
int len2 = anotherString.value.length;
int lim = Math.min(len1, len2);
char v1[] = value;
char v2[] = anotherString.value;
int k = 0;
while (k < lim) {
char c1 = v1[k];
char c2 = v2[k];
if (c1 != c2) {
return c1 - c2;
}
k++;
}
return len1 - len2;
}
4、日期的比较
- 源码
public int compareTo(Date anotherDate) {
long thisTime = getMillisOf(this);
long anotherTime = getMillisOf(anotherDate);
return (thisTime<anotherTime ? -1 : (thisTime==anotherTime ? 0 : 1));
}
自定义类排序
排序的实体类都实现了comparable
接口,次接口中只有一个方法public int compareTo(Object obj)
返回值 | 解释 |
---|---|
0 | this = obj |
正数 | this > obj |
负数 | this < obj |
1、 排序类实现Comparable接口
-
若一个类实现了
Comparable
接口,就意味着“该类支持排序”。 假设“有一个List列表(或数组),里面的元素是实现了Comparable
接口的类”,则该List
列表(或数组)可以通过Collections.sort
(或Arrays.sort
)进行排序。 -
此外,“实现
Comparable
接口的类的对象”可以用作“有序映射(如TreeMap
)”中的键或“有序集合(TreeSet
)”中的元素,而不需要指定比较器
2、 Comparator比较器接口
- 我们若需要控制某个类的次序,而该类本身不支持排序(即没有实现Comparable接口);我们可以建立一个“比较器”来进行排序。这个“比较器”只需要实现Comparator接口即可。
// list需要排序的容器
// new ... 实现comparable接口的类
// 返回值是int
// o1 在前 则从大到小排序
// o1 在后
Collections.sort(list, new Comparator<People>() {
@Override
public int compare(People o1, People o2) {
return (o2.getAge()-o1.getAge());
}
});
3、两者的区别
Comparator
位于包java.util
下,而Comparable
位于包java.lang
下,Comparable
接口将比较代码嵌入自身类中,而后者在一个独立的类中实现比较。 如果类的设计师没有考虑到Compare
的问题而没有实现Comparable
接口,可以通过 Comparator
来实现比较算法进行排序,并且为了使用不同的排序标准做准备,比如:升序、降序。