关于List操作排序工具,collection.sort的原理
2015-06-01 20:19
537 查看
public class Solution { public int findKthLargest(int[] nums, int k) { // 首先先将数组存入一个List当中,便于我们操作 List<Integer> list = new ArrayList<Integer>(); for(int num:nums){ list.add(num); } //通过重写Collections.sort执行排序操作 // Collections.sort(list,new Comparator<Integer>(){ // public int compare(Integer arg0,Integer arg1){ // return arg0.compareTo(arg1); // } // }); Collections.sort(list); //因为要求的是第几大的,所以我们只需要从后面往前数就行了 return list.get(nums.length-k); } }
那天在进行list的排序操作的时候用到了collection.sort,于是就想找来看看关于collection.sort的实现、
@SuppressWarnings("unchecked") public static <T extends Comparable<? super T>> void sort(List<T> list) { Object[] array = list.toArray(); Arrays.sort(array); int i = 0; ListIterator<T> it = list.listIterator(); while (it.hasNext()) { it.next(); it.set((T) array[i++]); } }
从中可以看出排序主体为Arrays.sort(array);Arrays的sort实现为
public static void sort(Object[] array) { // BEGIN android-changed ComparableTimSort.sort(array); // END android-changed }
继续追踪,ComparableTimSort的sort实现ComparableTimSort.sort
static void sort(Object[] a)到static void sort(Object[] a, int lo, int hi)到private static void binarySort(Object[] a, int lo, int hi, int start)。
在binarySort中用于大小比较部分为:
Comparable<Object> pivot = (Comparable) a[start]; int left = lo; int right = start; assert left <= right; while (left < right) { int mid = (left + right) >>> 1; if (pivot.compareTo(a[mid]) < 0) right = mid; else left = mid + 1; }
会调用Object的compareTo进行比较。而默认类似String和Integer类型都已经覆盖compareTo方法。所以可以自行进行比较。
所以在自定义类进行比较时,可以继承自Comparable,并实现compareTo即可调用Collections.sort对自定义对象进行排序,也可以重载
collections的sort函数进行比较。
相关文章推荐
- 阅读程序 多重继承
- java web tomcat,myeclipse, mysql
- 我想过不打扰,却发现做不到。
- 集合框架(四)如何使用以及何时使用HashSet、LinkedHashSet或者TreeSet来存储元素
- Jsp初探2015-06-01
- html5语义化标签(二)
- 创建了对嵌入的互操作程序集间接引用,无法嵌入互操作类型
- 启动代码和Bootloader区别
- 使用预处理语句实现数据查询的方法
- 在PowerPoint插入可计算和排序表格ppt模板素材
- Android属性动画完全解析(上),初识属性动画的基本用法 .
- 九度OJ-题目1510:替换空格
- HTML语义化标签(一)
- 织梦ajax登陆
- 关于利用Postfix邮件网关接收外网投递邮件失败问题的解决方法
- 集合框架(三)使用Iterator接口来遍历一个集合和使用for-each循环简化
- Java参数检查
- Preemphasizer API 及预加重
- 导入Maven项目,启动tomcat报错
- C# 将Excel转xml