不良代碼展示-Android排序的實現

原創文章,如有轉載,請註明出處: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;
	}
	
	@Override
	public int compareTo(Object o) {
		Point other = (Point) o;
		return getMix() - other.getMix();
	}
	
	@Override
	public 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返回負數,則表示當前對象小於傳入的參數。





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章