原創文章,如有轉載,請註明出處:http://blog.csdn.net/yihui823/article/details/6833067
不良代碼:
int[] iArray = {12,122,123,124,1,};//對iArray排序int iMin = 999999;int indexMin = 0;int iTmp = 0;for(int i = 0;i < iArray.length;i++) {//找到最小的for(int j = i; j < iArray.length; j++) {if (iMin > iArray[j]) {iMin = iArray[j];indexMin = j;}}//放在最前面iTmp = iArray[i];iArray[i] = iArray[indexMin];iArray[indexMin] = iTmp;}for(int i = 0;i < iArray.length;i++) {System.out.print(iArray[i] + ",");}System.out.println();
首先,這裡有個BUG。最小數值初始化賦的是999999,如果數組裡面的數都比999999大,那麼排序將不會進行。
我們可以把999999 改成 Integer.MAX_VALUE,就不會有這個問題了。
其次,只是對一個數組進行排序,是不需要自己來寫的。Arrays裡面,有排序的函數。程式可以改成:
int[] iArray = {12,122,123,124,1,};//對iArray排序Arrays.sort(iArray);for(int i = 0;i < iArray.length;i++) {System.out.print(iArray[i] + ",");}System.out.println();
那麼,如果要排序的不是整數,而是一個對象怎麼辦?
例如,我們有個類:
public class Point {private int x;private int y;public Point(int x, int y) {this.x = x;this.y = y;}}
我們現在需要對這個類的一個數組進行排序。能不能使用系統的排序函數呢。當然是可以的。
首先,我們的類要實現介面:Comparable。也就是,這個對象必須是可以比較的。
其次,我們要實現這個介面所定義的函數:compareTo。
修改後的類如下:
public class Point implements Comparable {private int x;private int y;public Point(int x, int y) {this.x = x;this.y = y;}private int getMix() {return (x << 8) + y;}@Overridepublic int compareTo(Object o) {Point other = (Point) o;return getMix() - other.getMix();}@Overridepublic String toString() {return "(" + x + "," + y + ")";}}
排序的代碼如下:
//隨機產生5個對象Random random = new Random();List<Point> lst = new ArrayList<Point>();for(int i = 0; i < 5; i ++) {lst.add(new Point(random.nextInt(100), random.nextInt(100)));}Point[] pArray = lst.toArray(new Point[lst.size()]);//對Point數組進行排序Arrays.sort(pArray);for(int i = 0;i < pArray.length;i++) {System.out.print(pArray[i] + ",");}System.out.println();
在compareTo函數裡,一般都是自己的對象所對應的值,減去需要比較的對象所對應的值。如果compareTo返回負數,則表示當前對象小於傳入的參數。