在编程的过程中,我们必不可少的会遇到排序问题。好在Java中,有些类的方法已经给排序提供了很好的解决办法了;另外实现某些能够实现排序的接口也可以达到排序的目的。当然了,你也可以直接写排序算法。不过在这一篇blog里,还是主要介绍已有的方法和接口。
首先当然是我们很熟悉的Arrays.sort()方法了。废话不多说,看代码:
- importjava.util.*;
- publicclassTestArraysSort{
- finalstaticintARRAY_LENGTH=1000000;
- publicstaticvoidmain(Stringargs[]){
- int[]intArray=newint[ARRAY_LENGTH];
- for(inti=0;i<ARRAY_LENGTH;i++)
- intArray[i]=(int)(i+Math.random()*i);
- longtimeFirst=System.currentTimeMillis();
- Arrays.sort(intArray);
- System.out.println("Lasts:"+(System.currentTimeMillis()-timeFirst)/1000+"s");
- }
- }
运行结果是:
- Lasts:0s//真他娘的快啊...
查看Java API文档,其实Arrays.sort()方法的参数很多,包括整形数组,字符型数组,Object型数组(也就是自定义的抽象类型的数组)。但是这个类必须实现java.lang.comparable接口,说明白点就是要实现这个类下面的抽象方法int compareTo(Object o)。以Collections.sort()为例,请看代码:
- importjava.util.*;
- classMarkimplementsComparable{
- privateStringname;
- privateStringcourse;
- privatedoublemark;
- publicMark(Stringname,Stringcourse,doublemark){
- this.name=name;
- this.course=course;
- this.mark=mark;
- }
- publicintcompareTo(Objecto){
- Markm=(Mark)o;
- return(int)(this.mark-m.mark);
- }
- publicStringtoString(){
- return"("+name+"-"+course+"-"+String.valueOf(mark)+")";
- }
- }
- publicclassTestCollectionsSort{
- publicstaticvoidmain(Stringargs[]){
- List<Mark>list=newArrayList<Mark>();
- Markmark1=newMark("S1","Maths",68.5);
- Markmark2=newMark("S1","Maths",78.5);
- Markmark3=newMark("S1","Maths",62.5);
- Markmark4=newMark("S1","Maths",98.5);
- Markmark5=newMark("S1","Maths",82.5);
- list.add(mark1);
- list.add(mark2);
- list.add(mark3);
- list.add(mark4);
- list.add(mark5);
- System.out.println(list);
- Collections.sort(list);
- System.out.println(list);
- }
- }
运行结果:
- [(S1-Maths-68.5),(S1-Maths-78.5),(S1-Maths-62.5),(S1-Maths-98.5),(S1-Maths-82.5)]
- [(S1-Maths-62.5),(S1-Maths-68.5),(S1-Maths-78.5),(S1-Maths-82.5),(S1-Maths-98.5)]
如果你要按照不同的标准进行排序的话,还可以求助于另一个java.util.Comparator接口。例如File类是实现了Comaparable接口的,但是它是按照文件名进行排序的,下面这段代码实现了按文件大小和修改时间排序的功能。请看代码:
- importjava.util.*;
- importjava.io.*;
- classFileComparator{
- staticclassCompratorByLastModifiedimplementsComparator{
- publicintcompare(Objecto1,Objecto2){
- Filefile1=(File)o1;
- Filefile2=(File)o2;
- longdiff=file1.lastModified()-file2.lastModified();
- if(diff>0)
- return1;
- elseif(diff==0)
- return0;
- else
- return-1;
- }
- publicbooleanequals(Objectobj){
- returntrue;//因为不会用到这个方法,所以只是简单的返回一个true
- }
- }
- staticclassCompratorBySizeimplementsComparator{
- publicintcompare(Objecto1,Objecto2){
- Filefile1=(File)o1;
- Filefile2=(File)o2;
- longdiff=file1.length()-file2.length();
- if(diff>0)
- return1;
- elseif(diff==0)
- return0;
- else
- return-1;
- }
- publicbooleanequals(Objectobj){
- returntrue;//因为不会用到这个方法,所以只是简单的返回一个true
- }
- }
- }
- publicclassFileSort{
- publicstaticvoidmain(Stringargs[]){
- Filefile=newFile("C:\\Folder");
- File[]fileArray=file.listFiles();
- System.out.println("SortedbyName:");
- Arrays.sort(fileArray);
- for(inti=0;i<fileArray.length;i++)
- System.out.println(fileArray[i]);
- System.out.println("SortedbySize:");
- Arrays.sort(fileArray,newFileComparator.CompratorBySize());
- for(inti=0;i<fileArray.length;i++)
- System.out.println(fileArray[i]);
- System.out.println("SortedbyLastModifiedTime:");
- Arrays.sort(fileArray,newFileComparator.CompratorByLastModified());
- for(inti=0;i<fileArray.length;i++)
- System.out.println(fileArray[i]);
- }
- }
运行结果是:
- SortedbyName:
- C:\Folder\1.txt
- C:\Folder\2.txt
- C:\Folder\3.txt
- SortedbySize:
- C:\Folder\1.txt
- C:\Folder\3.txt
- C:\Folder\2.txt
- SortedbyLastModifiedTime:
- C:\Folder\1.txt
- C:\Folder\3.txt
- C:\Folder\2.txt