Java中的排序(一)

在编程的过程中,我们必不可少的会遇到排序问题。好在Java中,有些类的方法已经给排序提供了很好的解决办法了;另外实现某些能够实现排序的接口也可以达到排序的目的。当然了,你也可以直接写排序算法。不过在这一篇blog里,还是主要介绍已有的方法和接口。

首先当然是我们很熟悉的Arrays.sort()方法了。废话不多说,看代码:

  1. import java.util.*;
  2. public class TestArraysSort {
  3.     final static int ARRAY_LENGTH = 1000000;
  4.     
  5.     public static void main(String args[]){
  6.         int[] intArray = new int[ARRAY_LENGTH];
  7.         
  8.         for (int i=0; i<ARRAY_LENGTH; i++)
  9.             intArray[i] = (int)(i + Math.random()*i);
  10.         
  11.         long timeFirst = System.currentTimeMillis();
  12.         Arrays.sort(intArray);
  13.         System.out.println("Lasts: "+ (System.currentTimeMillis() - timeFirst)/1000 +"s");
  14.     }
  15. }

运行结果是:

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

查看Java API文档,其实Arrays.sort()方法的参数很多,包括整形数组,字符型数组,Object型数组(也就是自定义的抽象类型的数组)。但是这个类必须实现java.lang.comparable接口,说明白点就是要实现这个类下面的抽象方法int compareTo(Object o)。以Collections.sort()为例,请看代码:

  1. import java.util.*;
  2. class Mark implements Comparable{
  3.     private String name;
  4.     private String course;
  5.     private double mark;
  6.     
  7.     public Mark(String name, String course, double mark){
  8.         this.name = name;
  9.         this.course = course;
  10.         this.mark = mark;
  11.     }
  12.     
  13.     public int compareTo(Object o){
  14.         Mark m = (Mark)o;
  15.         return (int)(this.mark - m.mark);
  16.     }
  17.     
  18.     public String toString(){
  19.         return "( "+ name +"-"+ course +"-"+ String.valueOf(mark) +" )";
  20.     }
  21. }
  22. public class TestCollectionsSort {
  23.     public static void main(String args[]){
  24.         List<Mark> list = new ArrayList<Mark> ();
  25.         
  26.         Mark mark1 = new Mark("S1""Maths"68.5);
  27.         Mark mark2 = new Mark("S1""Maths"78.5);
  28.         Mark mark3 = new Mark("S1""Maths"62.5);
  29.         Mark mark4 = new Mark("S1""Maths"98.5);
  30.         Mark mark5 = new Mark("S1""Maths"82.5);
  31.         
  32.         list.add(mark1);
  33.         list.add(mark2);
  34.         list.add(mark3);
  35.         list.add(mark4);
  36.         list.add(mark5);
  37.         
  38.         System.out.println(list);
  39.         
  40.         Collections.sort(list);
  41.         
  42.         System.out.println(list);
  43.     }
  44. }

运行结果:

  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. import java.util.*;
  2. import java.io.*;
  3. class FileComparator{
  4.     static class CompratorByLastModified implements Comparator {
  5.         public int compare(Object o1, Object o2) {
  6.             File file1 = (File)o1;
  7.             File file2 = (File)o2;
  8.             long diff = file1.lastModified() - file2.lastModified();
  9.             if (diff > 0)
  10.                 return 1;
  11.             else if (diff == 0)
  12.                 return 0;
  13.             else
  14.                 return -1;
  15.             }    
  16.         public boolean equals(Object obj){
  17.             return true//因为不会用到这个方法,所以只是简单的返回一个true
  18.         }
  19.     }    
  20.     static class CompratorBySize implements Comparator {
  21.         public int compare(Object o1, Object o2) {
  22.             File file1 = (File)o1;
  23.             File file2 = (File)o2;
  24.             long diff = file1.length() - file2.length();
  25.             if (diff > 0)
  26.                 return 1;
  27.             else if (diff == 0)
  28.                 return 0;
  29.             else
  30.                 return -1;
  31.         }
  32.      
  33.         public boolean equals(Object obj){
  34.             return true//因为不会用到这个方法,所以只是简单的返回一个true
  35.         }
  36.     }
  37. }
  38. public class FileSort {
  39.     public static void main(String args[]){
  40.         File file = new File("C://Folder");
  41.         
  42.         File[] fileArray = file.listFiles();
  43.         
  44.         System.out.println("Sorted by Name:");
  45.         Arrays.sort(fileArray);
  46.         
  47.         for(int i=0; i<fileArray.length; i++)
  48.             System.out.println(fileArray[i]);
  49.         
  50.         System.out.println("Sorted by Size:");
  51.         Arrays.sort(fileArray, new FileComparator.CompratorBySize());
  52.         
  53.         for(int i=0; i<fileArray.length; i++)
  54.             System.out.println(fileArray[i]);
  55.         
  56.         System.out.println("Sorted by Last Modified Time:");
  57.         Arrays.sort(fileArray, new FileComparator.CompratorByLastModified());
  58.         
  59.         for(int i=0; i<fileArray.length; i++)
  60.             System.out.println(fileArray[i]);
  61.     }
  62. }

运行结果是:

  1. Sorted by Name:
  2. C:/Folder/1.txt
  3. C:/Folder/2.txt
  4. C:/Folder/3.txt
  5. Sorted by Size:
  6. C:/Folder/1.txt
  7. C:/Folder/3.txt
  8. C:/Folder/2.txt
  9. Sorted by Last Modified Time:
  10. C:/Folder/1.txt
  11. C:/Folder/3.txt
  12. C:/Folder/2.txt

你可能感兴趣的:(java,算法,list,object,File,Blog)