这篇文章主要讲的是如何使用现有的类库对数组和各种Collection容器进行排序
首先要知道两个类
java
util
Arrays和java
util
Collections(注意和Collection的区 别)Collection是集合框架的顶层接口
而Collections是包含了许多静态方法
我们使用Arrays对数组进行排序
使用Collections对结合框架容器进行排序
如ArraysList
LinkedList等
例子中都要加上import java
util
*和其他外壳代码
如类和静态main方法
我会在第一个例子里写出全部代码
接下来会无一例外的省略
比如有一个整型数组
int[] intArray = new int[] { }; 我们如何进行排序呢?你这个时候是否在想快速排序的算法?看看下面的实现方法
import javautil*; public class Sort{
public static void main(String[] args){
int[] intArray = new int[] { };
Arrayssort(intArray) } }
这样我们就用Arrays的静态方法sort()对intArray进行了升序排序现在数组已经变成了{}
如果是字符数组String[] strArray = new String[] {z a C}; 我们用Arrayssort(strArray) 进行排序后的结果是{Caz}sort()会根据元素的自然顺序进行升序排序如果希望对大小写不敏感的话可以这样写Arrayssort(strArray StringCASE_INSENSITIVE_ORDER) 当然我们也可以指定数组的某一段进行排序比如我们要对数组下表的部分(假设数组长度大于)进行排序其他部分保持不变我们可以使用Arrayssort(strArray) 这样我们只对前三个元素进行了排序而不会影响到后面的部分
当然有人会想我怎样进行降序排序?在众多的sort方法中有一个sort(T[] a Comparator<? super T> c) 我们使用Comparator获取一个反序的比较器即可Comparator会在稍后讲解以前面的intArray[]为例Arrayssort(intArrayComparatorreverseOrder()) 这样我们得到的结果就是{}如果不想修改原有代码我们也可以使用Collectionsreverse(ArraysasList(intArray)) 得到该数组的反序结果同样为}
现在的情况变了我们的数组里不再是基本数据类型(primtive type)或者String类型的数组而是对象数组这个数组的自然顺序是未知的因此我们需要为该类实现Comparable接口比如我们有一个Name类
class Name implements Comparable<Name>{
public String firstNamelastName;
public Name(String firstNameString lastName){
thisfirstName=firstName;
thislastName=lastName; }
public int compareTo(Name o) { //实现接口
int lastCmp=pareTo(olastName)
return (lastCmp!=?lastCmp:pareTo(ofirstName)) }
public String toString(){ //便于输出测试
return firstName+ +lastName; } }
这样当我们对这个对象数组进行排序时就会先比较lastName然后比较firstName 然后得出两个对象的先后顺序就像compareTo(Name o)里实现的那样不妨用程序试一试
import javautil*;
public class NameSort {
public static void main(String[] args) {
Name nameArray[] = {
new Name(John Lennon)
new Name(Karl Marx)
new Name(Groucho Marx)
new Name(Oscar Grouch)
Arrayssort(nameArray)
for(inti=;i<nameArraylength;i++){
Systemoutprintln(nameArray[i]toString()) } } }
结果正如我们所愿
Oscar Grouch John Lennon Groucho Marx Karl Marx 对集合框架进行排序如果已经理解了Arrayssort()对数组进行排序的话集合框架的使用也是大同小异只是将Arrays替换成了Collections注意Collections是一个类而Collection是一个接口虽然只差一个s但是它们的含义却完全不同
假如有这样一个链表
LinkedList list=new LinkedList()
listadd()
listadd()
listadd()
listadd()
我们只需要使用Collectionssort(list) 就可以将ll里的元素按从小到大的顺序进行排序结果就成了[ ] 如果LinkedList里面的元素是String同样会想基本数据类型一样从小到大排序如果要实现反序排序也就是从达到小排序Collectionssort(listCollectonsreverseOrder()) 如果LinkedList里面的元素是自定义的对象可以像上面的Name对象一样实现Comparable接口就可以让Collectionsort()为您排序了如果你想按照自己的想法对一个对象进行排序你可以使用sort(List<T> list Comparator<? super T> c) 这个方法进行排序在给出例子之前先要说明一下Comparator的使用Comparable接口的格式public interface Comparator<T> { int compare(T o T o) } 其实Comparator里的int compare(T oT o)的写法和Comparable里的compareTo()方法的写法差不多在上面的Name类中我们的比较是从LastName开始的这是西方 人的习惯到了中国我们想从fristName开始比较又不想修改原来的代码这个时候Comparator就可以派上用场了
final Comparator<Name> FIRST_NAME_ORDER=new Comparator<Name>()
{
public int compare(Name n Name n)
{
int firstCmp=pareTo(nfirstName)
return(firstCmp!=?firstCmp:pareTo
(nfirstName))
}
};
这样一个我们自定义的Comparator FIRST_NAME_ORDER就写好了将上个例子里那个名字数组转化为List:List<Name> list=ArraysasList(nameArray) Collectionssort(listFIRST_NAME_ORDER) 这样我们就成功的使用自己定义的比较器设定排序