对数组排序有很多方法,但是对集合排序一般都以自定义排序的为多,其实利用Collection的sort也是可以实现的。
一、 Collections.sort(list,comparator)
举个例子:
一个实体类User,这里用age属性大小来排序,return的结果>0是大于,<0就是小于。另外这里是降序,要升序就看将两个参数对调即可。
class RankComparator extends Comparator<User>{
@Override
public int compare(Model lhs, Model rhs) {
// TODO Auto-generated method stub
return rhs.getAge() - lhs.getAge();
}
}
利用这种方法排序就十分简单明了。
二、自定义快排
快排作为一种基础的排序算法,还是应该掌握一下的。
这里再举一个例子,这里使用的降序,升序的话只要将timeK与 timeI和timeJ比较的大小与号反一下就好了:
public static void rankUser(List<User> users, int low, int high) {
int i = low;
int k = low;
int j = high;
int timeK = users.get(k).getAge();
while (i < j) {
for (; j != i; j--) {
int timeJ = users.get(j).getAge();
if (timeK < timeJ) {
// 右边有小于K的数就换位置
User user = users.get(j);
users.add(j, users.get(k));
users.remove(j + 1);
users.add(k, user);
users.remove(k + 1);
k = j;
break;
}
}
for (; j != i; i++) {
int timeI = users.get(i).getAge();
if (timeK > timeI) {
// 左边有大于K的数就换位置
User user = users.get(i);
users.add(i, users.get(k));
users.remove(i + 1);
users.add(k, user);
users.remove(k + 1);
k = i;
break;
}
}
}
if (i > low) {
rankUser(users, low, i - 1);
}
if (j < high) {
rankUser(users, j + 1, high);
}
}
其实没有什么太大难度,只要理解快排的流程再加上递归就完事啦。