Android排序的实现- 给新手
不良代码:
view plain
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里面,有排序的函数。程序可以改成:
view plain
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();
那么,如果要排序的不是整数,而是一个对象怎么办?
例如,我们有个类:
view plain
public class Point {
private int x;
private int y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
}
我们现在需要对这个类的一个数组进行排序。能不能使用系统的排序函数呢。当然是可以的。
首先,我们的类要实现接口:Comparable。也就是,这个对象必须是可以比较的。
其次,我们要实现这个接口所定义的函数:compareTo。
修改后的类如下:
view plain
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 + ")";
}
}
排序的代码如下:
view plain
//随机生成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返回负数,则表示当前对象小于传入的参数。
作者“yihui823的专栏”
补充:移动开发 , Android ,