要实现List进行排序我们看下API文档
java.util:
Interface Collection,Interface Comparator
Class Collections
java.lang:
Interface Comparable
Class Collections中有个排序方法sort:
public static <T extends Comparable<? super T>> void sort(List<T> list)
这个方法申明说明了以下几个内容:
1.sort的入参是List
2.List中放入的类型是T
3.T是要实现了Comparable接口的类
4.Comparable的类型参数是T或者是T的父型
5.上面的Comparable是个接口,为什么用extends ?
以泛型的观点来说,extends这个关键词代表的“是一个”且适用于类和接口
所有可以“排序”的类都实现了java.lang.Comparable接口。Comparable接口中只有一个方法,public int compareTo(Object obj): 该方法:
返回0,表示 this == obj
返回正数,表示this > obj
返回负数,表示 this < obj
实现了Comparable接口的类通过实现compareTo方法从而确定该类对象的排序方式。
该Name类实现了Comparable接口,重写compareTo方法
package mashibing.java;
public class Name implements Comparable<Name> {
private final String firstName,lastName;
public Name(String firstName,String lastName){
if (firstName == null ||lastName == null)
throw new NullPointerException();
this.firstName = firstName;
this.lastName = lastName;
}
public String firstName(){return firstName;}
public String lastName(){return lastName;}
public boolean equals(Object o){
if (!(o instanceof Name))
return false;
Name n= (Name) o;
return n.firstName.equals(firstName) && n.lastName.equals(lastName);
}
public int hashCode(){
return 31*firstName.hashCode() + lastName.hashCode();
}
public String toString(){
return firstName + " " + lastName;
}
@Override
public int compareTo(Name n) {
int lastCmp = lastName.compareTo(n.lastName);
return (lastCmp != 0 ? lastCmp : firstName.compareTo(n.firstName));
}
}
上面重写的compareTo方法,接收一个Object类,强制将其转换成Name类,先将lastName进行比较,比较使用的是String类的重写的compareTo方法下面展示的是String类别的compareTo方法,取了两个长度值的最小值,依照次序来比较每个char的的值得大小,char中保存的是ACSII的值,直到两个字符的值不一样,否则就返回两个char字符的差值,如果在k大于两个中的最小值的之前还没有返回出来的一个值得话,那么就比较两个长度的大小。
private final char value[];
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;
}
看下下面主程序,使用了Collections.sort(names),对names这个List进行了排序,这个List中的元素是Name类型的,Name按照API的sort的要求实现了Comparable接口重写了compareTo方法。所以可以对该List进行排序。
import java.util.*;
public class test {
public static void main(String[] args) {
Name nameArray[] = {
new Name("John", "Smith"),
new Name("Karl", "Ng"),
new Name("Jeff", "Smith"),
new Name("Tom", "Rich")
};
List<Name> names = Arrays.asList(nameArray);
Collections.sort(names);
System.out.println(names);
}
}
网友评论