- 浏览: 103268 次
- 性别:
- 来自: 北京
最新评论
今天在看相关代码时候看到了 Collections.sort(), 知道Collections是一个工具类 里面包含了很多排序查找等静态方法 是一个很好的util工具类。 但是代码没有仔仔细细的好好看看,今天看了一下 有点小体会。
首先,开始原始的方法:
public static <T> void sort(List<T> list, Comparator<? super T> c) { Object[] a = list.toArray(); Arrays.sort(a, (Comparator)c); ListIterator i = list.listIterator(); for (int j=0; j<a.length; j++) { i.next(); i.set(a[j]); } }
发现先将list变成Array,然后再排序,最后再转换回去。
先说toArray()方法吧
下面分别是ArrayList和LinkedList的实现
public Object[] toArray() { return Arrays.copyOf(elementData, size); //elementData是真正存放东西的数组 size是这个list的长度 }//不难理解 ArrayList底层就是Array
public Object[] toArray() { Object[] result = new Object[size]; int i = 0; for (Entry<E> e = header.next; e != header; e = e.next) result[i++] = e.element; return result; }//也不难理解 无非就是便利一下 放到数组里并返回
看完了toArray() 再来看一下 sort()吧
Array.sort()是这样的
public static <T> void sort(T[] a, Comparator<? super T> c) { T[] aux = (T[])a.clone(); if (c==null) mergeSort(aux, a, 0, a.length, 0); else mergeSort(aux, a, 0, a.length, 0, c); }
用的是mergeSort方法 这个方法的几个参数的含义是:src, dest, low, high, offset, compartor 见名之意
至于这个mergeSort方法嘛 肯定是一个递归操作了 但是这里面也有几个小细节
private static void mergeSort(Object[] src, Object[] dest, int low, int high, int off, Comparator c) { int length = high - low; // Insertion sort on smallest arrays 这里 // INSERTIONSORT_THRESHOLD是7 意思如果太小 用插入排序会更好 if (length < INSERTIONSORT_THRESHOLD) { for (int i=low; i<high; i++) for (int j=i; j>low && c.compare(dest[j-1], dest[j])>0; j--) swap(dest, j, j-1); return; } // Recursively sort halves of dest into src int destLow = low; int destHigh = high; low += off; high += off; int mid = (low + high) >>> 1; //注意 这里 没用'/2' mergeSort(dest, src, low, mid, -off, c); mergeSort(dest, src, mid, high, -off, c); // If list is already sorted, just copy from src to dest. This is an // optimization that results in faster sorts for nearly ordered lists. if (c.compare(src[mid-1], src[mid]) <= 0) { //考虑到已经有序的情况 System.arraycopy(src, low, dest, destLow, length); return; } // Merge sorted halves (now in src) into dest 合并过程 for(int i = destLow, p = low, q = mid; i < destHigh; i++) { if (q >= high || p < mid && c.compare(src[p], src[q]) <= 0) dest[i] = src[p++]; else dest[i] = src[q++]; } }
上面的一个方法 考虑到了差不多3种情况吧 真正的源码 果然严谨
发表评论
-
hibernate中htm.xml注意的一个问题
2011-06-08 12:00 880遇到了这个问题 总是报 org.hibernate ... -
罗马数字转成阿拉伯数字
2011-06-02 13:15 2617首先得知道罗马数字是怎么回事: http://520920. ... -
有关于验证码的
2011-06-01 13:00 634验证码 是怎么出来的呢 应该有很多种方式,今天看到了一段代码中 ... -
转系统架构的一片文章
2011-05-13 14:27 718原文其实应该是.NET上面的 但是我觉得架构上同样适用 ... -
java中从汉字得到拼音的函数【转载】
2011-05-11 10:17 891public class GB2Alpha { ... -
后缀树 后缀数组 字符串的 那些面试题... 【烂,别点进来】
2011-04-24 16:28 1580最近在总结点面试题,好像放在公司里,忘记拷到U盘上了。回去传到 ... -
海量数据的匹配 bloom filter 【别进来 很烂】
2011-04-22 10:30 1019引出 是老张说的腾讯的面试题 说 昨天有一亿个QQ登陆 ... -
Hello mina 【别进来 烂 会后悔】
2011-04-18 17:46 758mina nio 开源代码 以上是关键字 感觉 ... -
java nio & reactor
2011-04-15 14:26 848想看 java io很久了 菜的很 两个文章和一本书 小了解一 ... -
vm到jsp
2011-02-14 14:54 2118http://www.iteye.com/topic/1355 ... -
json&jsonP&跨域
2011-01-10 15:58 777http://www.ibm.com/developerwor ... -
PermGen space
2010-12-14 11:59 716http://blog.csdn.net/Jerry_R ... -
编程珠玑课后题,吝啬的初始化
2010-12-05 16:20 1045在这里,我们有一个稀疏的数组需要访问,并且在第一次访问的时 ... -
BitSet 原理&位操作&基本类型的大小
2010-12-05 11:52 1865因为在看编程珠玑 第一章讲到了 用BitSet来对N多数字进行 ... -
JVM 小总结
2010-11-25 14:22 653http://www.iteye.com/topic/8218 ... -
jdk5.0 6.0新特性
2010-11-25 08:18 566也许会被蛋疼的人问道吧 http://qwzhl100 ... -
对象的复制:ezmorph
2010-11-17 10:59 734ezmoph组件 http://blog.csdn.net/ ... -
how tomcat works
2010-11-16 17:36 976http://jarfield.iteye.com/blog/ ... -
ThreadLocal
2010-11-14 22:05 772起因还是那天培训 对这个了解不深刻 赶紧看看 ... -
ConcurrentHashMap记录
2010-11-14 21:09 837那天的讲座中 武祥提到了 ConcurrentHashMap ...
相关推荐
当我们需要对List中的元素进行排序时,`Collections.sort()`方法就派上了用场。这个方法能够根据元素的自然顺序或者自定义的比较器进行排序。本文将深入探讨`Collections.sort()`的使用、原理以及如何自定义排序规则...
`public static <T> void sort(List<T> list, Comparator<? super T> c)` 其中,list是要排序的列表,c是比较器对象,用于定义排序的规则。如果不提供比较器对象,那么将使用列表元素的自然顺序进行排序。 ...
Java Collections.sort()实现List排序的默认方法和自定义方法 Java Collections.sort()是Java语言中用于对List进行排序的方法,通过使用这个方法可以对List进行默认排序,也可以根据需要实现自定义的排序规则。 ...
Collections.sort(list, new Comparator() { public int compare(ResultTypeDesc o1, ResultTypeDesc o2) { return o2.getRatio().compareTo(o1.getRatio()); } }); ``` 这里,`compare()` 方法的实现决定了排序...
Java Collections.sort() 排序代码案例 ... Java Collections.sort() 排序代码案例可以对列表进行自然排序,也可以根据 Comparator 对象对列表进行自定义排序。该方法非常重要,广泛应用于实际开发中。
Collections.sort(list, new Comparator() { @Override public int compare(Book b1, Book b2) { return Double.compare(b1.price, b2.price); // 按书的价格比较大小,用于自定义排序 } }); ``` `Collections....
`Collections.sort()` 可以根据元素的自然顺序或者自定义的比较器(Comparator)进行排序。 ### 1. 自然顺序排序 如果列表中的元素实现了 `Comparable` 接口,那么 `Collections.sort()` 会使用元素的自然顺序进行...
Collections.sort 方法的第二个参数形式是 public static <T> void sort(List<T> list, Comparator<? super T> c),该方法允许我们通过实现 Comparator 接口的 compare 方法来完成自定义排序。 下面是一个使用...
总结来说,Collections.sort方法提供了对List进行排序的强大功能。第一种方法适用于类本身能够定义其自然排序顺序的情况,即类实现Comparable接口。第二种方法适用于需要自定义排序规则或者类不支持自然排序的情况,...
`Collections.sort()`是Java中对List进行排序的方法,它接受一个List作为参数,并根据List中元素的自然顺序或者自定义比较器进行排序。在这个例子中,Map的键(key)通常是字符串或其他实现了Comparable接口的对象,...
* `Collections.sort(List<T> list, Comparator<? super T> c)`: 对列表进行自定义排序。 线程安全操作 Collections 中的线程安全操作方法包括同步和不可变集合。这些方法用于保证集合的线程安全。 * `...
persons.sort(Comparator.comparing(Person::getAge).reversed()); ``` 这里,`Comparator.comparing(Person::getAge)`创建了一个基于`Person`对象的`age`属性比较的`Comparator`,而`.reversed()`则将比较结果反转...
Collections.sort(list, new Comparator() { @Override public int compare(Person p1, Person p2) { return p1.getAge() - p2.getAge(); } }); ``` 这里 `Person` 类需要包含 `getName()` 和 `getAge()` 方法...
Collections.sort(list, OrderName); Collections.reverse(list); ``` 4. **遍历和打印结果**: - 最后,我们遍历排序后的列表,并打印每个`BookType`对象的`idsn`和`name`。 #### 总结 通过以上示例,我们...
在Java编程中,Collections工具类提供了许多方便的集合操作,其中`sort()`方法是一个非常重要的功能,用于对List类型的集合进行排序。本文将详细介绍`Collections.sort()`方法的两种使用方式及其示例。 ### 一、...
当ArrayList中的元素是基本数据类型(如Integer、Double等)或者是实现了Comparable接口的类时,可以直接调用`Collections.sort(list)`进行排序。例如,对于一个包含Integer对象的ArrayList,排序代码如下: ```...
userList.sort(Comparator.comparing(User::getAge)); ``` Comparator也可以用于TreeMap和TreeSet,它们会根据提供的Comparator进行自动排序: ```java TreeSet<User> treeSet = new TreeSet(Comparator.comparing...
在Java编程语言中,ArrayList是...总的来说,对ArrayList中的对象进行排序涉及到Java集合框架的核心概念,包括List接口、Collections工具类以及Comparator接口。理解这些知识点对于编写高效、灵活的Java代码至关重要。
`Collections.sort()`方法可以对任何实现了`List`接口的对象进行排序,它默认使用元素的自然顺序(即元素所属类必须实现`Comparable`接口)。 首先,让我们了解一下`Collections.sort()`的基本用法。假设我们有一个...
Collections.sort(list, Comparator.reverseOrder()); ``` ### 7. 自定义对象排序 对于自定义类,如果希望其实例能直接参与自然排序,可以在类中实现`Comparable<T>`接口。不过,当需要特殊排序逻辑时,使用`...