1. 程式人生 > >Java中的排序(一)

Java中的排序(一)

在程式設計的過程中,我們必不可少的會遇到排序問題。好在Java中,有些類的方法已經給排序提供了很好的解決辦法了;另外實現某些能夠實現排序的介面也可以達到排序的目的。當然了,你也可以直接寫排序演算法。不過在這一篇blog裡,還是主要介紹已有的方法和介面。

首先當然是我們很熟悉的Arrays.sort()方法了。廢話不多說,看程式碼:

  1. importjava.util.*;
  2. publicclassTestArraysSort{
  3. finalstaticintARRAY_LENGTH=1000000;
  4. publicstaticvoidmain(Stringargs[]){
  5. int[]intArray=
    newint[ARRAY_LENGTH];
  6. for(inti=0;i<ARRAY_LENGTH;i++)
  7. intArray[i]=(int)(i+Math.random()*i);
  8. longtimeFirst=System.currentTimeMillis();
  9. Arrays.sort(intArray);
  10. System.out.println("Lasts:"+(System.currentTimeMillis()-timeFirst)/1000+"s");
  11. }
  12. }

執行結果是:

  1. Lasts:0s//真他孃的快啊...

檢視Java API文件,其實Arrays.sort()方法的引數很多,包括整形陣列,字元型陣列,Object型陣列(也就是自定義的抽象型別的陣列)。但是這個類必須實現java.lang.comparable介面,說明白點就是要實現這個類下面的抽象方法int compareTo(Object o)。以Collections.sort()為例,請看程式碼:

  1. importjava.util.*;
  2. classMarkimplementsComparable{
  3. privateStringname;
  4. privateStringcourse;
  5. privatedoublemark;
  6. publicMark(Stringname,Stringcourse,doublemark){
  7. this.name=name;
  8. this.course=course;
  9. this.mark=mark;
  10. }
  11. publicintcompareTo(Objecto){
  12. Markm=(Mark)o;
  13. return(int)(this.mark-m.mark);
  14. }
  15. publicStringtoString(){
  16. return"("+name+"-"+course+"-"+String.valueOf(mark)+")";
  17. }
  18. }
  19. publicclassTestCollectionsSort{
  20. publicstaticvoidmain(Stringargs[]){
  21. List<Mark>list=newArrayList<Mark>();
  22. Markmark1=newMark("S1","Maths",68.5);
  23. Markmark2=newMark("S1","Maths",78.5);
  24. Markmark3=newMark("S1","Maths",62.5);
  25. Markmark4=newMark("S1","Maths",98.5);
  26. Markmark5=newMark("S1","Maths",82.5);
  27. list.add(mark1);
  28. list.add(mark2);
  29. list.add(mark3);
  30. list.add(mark4);
  31. list.add(mark5);
  32. System.out.println(list);
  33. Collections.sort(list);
  34. System.out.println(list);
  35. }
  36. }

執行結果:

  1. [(S1-Maths-68.5),(S1-Maths-78.5),(S1-Maths-62.5),(S1-Maths-98.5),(S1-Maths-82.5)]
  2. [(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介面的,但是它是按照檔名進行排序的,下面這段程式碼實現了按檔案大小和修改時間排序的功能。請看程式碼:

  1. importjava.util.*;
  2. importjava.io.*;
  3. classFileComparator{
  4. staticclassCompratorByLastModifiedimplementsComparator{
  5. publicintcompare(Objecto1,Objecto2){
  6. Filefile1=(File)o1;
  7. Filefile2=(File)o2;
  8. longdiff=file1.lastModified()-file2.lastModified();
  9. if(diff>0)
  10. return1;
  11. elseif(diff==0)
  12. return0;
  13. else
  14. return-1;
  15. }
  16. publicbooleanequals(Objectobj){
  17. returntrue;//因為不會用到這個方法,所以只是簡單的返回一個true
  18. }
  19. }
  20. staticclassCompratorBySizeimplementsComparator{
  21. publicintcompare(Objecto1,Objecto2){
  22. Filefile1=(File)o1;
  23. Filefile2=(File)o2;
  24. longdiff=file1.length()-file2.length();
  25. if(diff>0)
  26. return1;
  27. elseif(diff==0)
  28. return0;
  29. else
  30. return-1;
  31. }
  32. publicbooleanequals(Objectobj){
  33. returntrue;//因為不會用到這個方法,所以只是簡單的返回一個true
  34. }
  35. }
  36. }
  37. publicclassFileSort{
  38. publicstaticvoidmain(Stringargs[]){
  39. Filefile=newFile("C:\\Folder");
  40. File[]fileArray=file.listFiles();
  41. System.out.println("SortedbyName:");
  42. Arrays.sort(fileArray);
  43. for(inti=0;i<fileArray.length;i++)
  44. System.out.println(fileArray[i]);
  45. System.out.println("SortedbySize:");
  46. Arrays.sort(fileArray,newFileComparator.CompratorBySize());
  47. for(inti=0;i<fileArray.length;i++)
  48. System.out.println(fileArray[i]);
  49. System.out.println("SortedbyLastModifiedTime:");
  50. Arrays.sort(fileArray,newFileComparator.CompratorByLastModified());
  51. for(inti=0;i<fileArray.length;i++)
  52. System.out.println(fileArray[i]);
  53. }
  54. }

執行結果是:

  1. SortedbyName:
  2. C:\Folder\1.txt
  3. C:\Folder\2.txt
  4. C:\Folder\3.txt
  5. SortedbySize:
  6. C:\Folder\1.txt
  7. C:\Folder\3.txt
  8. C:\Folder\2.txt
  9. SortedbyLastModifiedTime:
  10. C:\Folder\1.txt
  11. C:\Folder\3.txt
  12. C:\Folder\2.txt