Java中的排序(一)
阿新 • • 發佈:2019-01-03
在程式設計的過程中,我們必不可少的會遇到排序問題。好在Java中,有些類的方法已經給排序提供了很好的解決辦法了;另外實現某些能夠實現排序的介面也可以達到排序的目的。當然了,你也可以直接寫排序演算法。不過在這一篇blog裡,還是主要介紹已有的方法和介面。
首先當然是我們很熟悉的Arrays.sort()方法了。廢話不多說,看程式碼:
- importjava.util.*;
- publicclassTestArraysSort{
- finalstaticintARRAY_LENGTH=1000000;
- publicstaticvoidmain(Stringargs[]){
-
int[]intArray=
- 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