最近没事写了一个彩票开奖情况统计程序,其中碰到了需要对数字出现的次数排序的问题,因为涉及到对象属性的排序,觉得有必要总结一下,没多少技术含量,只是认识了一个新的接口,权当学习了,呵呵。
以前碰到排序的问题大部分都只是针对单序列的,直接sort一下就完事了,如果是需要对某个对象的某一属性排序,或者说需要对key-value对进行排序,这就稍微有点麻烦了。
最弱智的方法就是直接对key-value进行冒泡或选择等基本排序,同时交换key和value,逻辑最简单,但是时间复杂度也是最高的。其次稍微好点的可以用快排或堆排序,这里就没必要细讲了,我主要想介绍的是实现Comparable接口的排序。
首先通过bean类去继承Comparable接口,实现方法compareTo,通过这个方法返回需要排序的value。然后再主类中将bean对象放入list中,调用Collections.sort(list)方法,就能按compareTo方法中的value值进行排序。下面是部分代码:
ok,这样就能按照Number对象的count值对其进行排序了。当然,排序不仅仅限升序一种,还有降序排列Collections.sort(list, Collections.reverseOrder()),反转排列Collections.reverse(list)等等。
其实采用这种方法并不是为了缩短时间复杂度,我个人觉得这样能让代码显得更简洁些,多调用些已经存在的类和方法总好过自己去实现一套差不多的类或方法。
以前碰到排序的问题大部分都只是针对单序列的,直接sort一下就完事了,如果是需要对某个对象的某一属性排序,或者说需要对key-value对进行排序,这就稍微有点麻烦了。
最弱智的方法就是直接对key-value进行冒泡或选择等基本排序,同时交换key和value,逻辑最简单,但是时间复杂度也是最高的。其次稍微好点的可以用快排或堆排序,这里就没必要细讲了,我主要想介绍的是实现Comparable接口的排序。
首先通过bean类去继承Comparable接口,实现方法compareTo,通过这个方法返回需要排序的value。然后再主类中将bean对象放入list中,调用Collections.sort(list)方法,就能按compareTo方法中的value值进行排序。下面是部分代码:
public class Number implements Comparable<Number> {
private String num;
private int count;
......
......
public int compareTo(Number o) {
return this.getCount() - o.getCount();
}
}
public List<Number> getSort(Number[] number) {
List<Number> list = new ArrayList<Number>();
for(int i=0;i<number.length;i++) {
list.add(number[i]);
}
Collections.sort(list);
return list;
}
ok,这样就能按照Number对象的count值对其进行排序了。当然,排序不仅仅限升序一种,还有降序排列Collections.sort(list, Collections.reverseOrder()),反转排列Collections.reverse(list)等等。
其实采用这种方法并不是为了缩短时间复杂度,我个人觉得这样能让代码显得更简洁些,多调用些已经存在的类和方法总好过自己去实现一套差不多的类或方法。