`
cheer_nice
  • 浏览: 103268 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

由Collections.sort(list, Comparator()); 说开来

    博客分类:
  • j2se
阅读更多

今天在看相关代码时候看到了 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种情况吧 真正的源码 果然严谨

 

 

 

 

分享到:
评论

相关推荐

    java List 排序 Collections.sort

    当我们需要对List中的元素进行排序时,`Collections.sort()`方法就派上了用场。这个方法能够根据元素的自然顺序或者自定义的比较器进行排序。本文将深入探讨`Collections.sort()`的使用、原理以及如何自定义排序规则...

    java中Collections.sort排序详解

    `public static &lt;T&gt; void sort(List&lt;T&gt; list, Comparator&lt;? super T&gt; c)` 其中,list是要排序的列表,c是比较器对象,用于定义排序的规则。如果不提供比较器对象,那么将使用列表元素的自然顺序进行排序。 ...

    Java Collections.sort()实现List排序的默认方法和自定义方法

    Java Collections.sort()实现List排序的默认方法和自定义方法 Java Collections.sort()是Java语言中用于对List进行排序的方法,通过使用这个方法可以对List进行默认排序,也可以根据需要实现自定义的排序规则。 ...

    JAVA对list集合进行排序Collections.sort()

    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() 排序代码案例 ... Java Collections.sort() 排序代码案例可以对列表进行自然排序,也可以根据 Comparator 对象对列表进行自定义排序。该方法非常重要,广泛应用于实际开发中。

    详解Java中Collections.sort排序

    Collections.sort(list, new Comparator() { @Override public int compare(Book b1, Book b2) { return Double.compare(b1.price, b2.price); // 按书的价格比较大小,用于自定义排序 } }); ``` `Collections....

    java中Collections.sort排序函数用法详解

    `Collections.sort()` 可以根据元素的自然顺序或者自定义的比较器(Comparator)进行排序。 ### 1. 自然顺序排序 如果列表中的元素实现了 `Comparable` 接口,那么 `Collections.sort()` 会使用元素的自然顺序进行...

    详解java Collections.sort的两种用法

    Collections.sort 方法的第二个参数形式是 public static &lt;T&gt; void sort(List&lt;T&gt; list, Comparator&lt;? super T&gt; c),该方法允许我们通过实现 Comparator 接口的 compare 方法来完成自定义排序。 下面是一个使用...

    用Java集合中的Collections.sort方法如何对list排序(两种方法)

    总结来说,Collections.sort方法提供了对List进行排序的强大功能。第一种方法适用于类本身能够定义其自然排序顺序的情况,即类实现Comparable接口。第二种方法适用于需要自定义排序规则或者类不支持自然排序的情况,...

    listview按序排列显示

    `Collections.sort()`是Java中对List进行排序的方法,它接受一个List作为参数,并根据List中元素的自然顺序或者自定义比较器进行排序。在这个例子中,Map的键(key)通常是字符串或其他实现了Comparable接口的对象,...

    Collections

    * `Collections.sort(List&lt;T&gt; list, Comparator&lt;? super T&gt; c)`: 对列表进行自定义排序。 线程安全操作 Collections 中的线程安全操作方法包括同步和不可变集合。这些方法用于保证集合的线程安全。 * `...

    List对象集合的排序:比较器Comparator(简单例子)

    persons.sort(Comparator.comparing(Person::getAge).reversed()); ``` 这里,`Comparator.comparing(Person::getAge)`创建了一个基于`Person`对象的`age`属性比较的`Comparator`,而`.reversed()`则将比较结果反转...

    java 使用Collections类对List的排序操作

    Collections.sort(list, new Comparator() { @Override public int compare(Person p1, Person p2) { return p1.getAge() - p2.getAge(); } }); ``` 这里 `Person` 类需要包含 `getName()` 和 `getAge()` 方法...

    Comparator 排序器

    Collections.sort(list, OrderName); Collections.reverse(list); ``` 4. **遍历和打印结果**: - 最后,我们遍历排序后的列表,并打印每个`BookType`对象的`idsn`和`name`。 #### 总结 通过以上示例,我们...

    JAVA中Collections工具类sort()排序方法

    在Java编程中,Collections工具类提供了许多方便的集合操作,其中`sort()`方法是一个非常重要的功能,用于对List类型的集合进行排序。本文将详细介绍`Collections.sort()`方法的两种使用方式及其示例。 ### 一、...

    arrayList排序

    当ArrayList中的元素是基本数据类型(如Integer、Double等)或者是实现了Comparable接口的类时,可以直接调用`Collections.sort(list)`进行排序。例如,对于一个包含Integer对象的ArrayList,排序代码如下: ```...

    java Comparator 用法 例子

    userList.sort(Comparator.comparing(User::getAge)); ``` Comparator也可以用于TreeMap和TreeSet,它们会根据提供的Comparator进行自动排序: ```java TreeSet&lt;User&gt; treeSet = new TreeSet(Comparator.comparing...

    arraylist 对象 数组排序

    在Java编程语言中,ArrayList是...总的来说,对ArrayList中的对象进行排序涉及到Java集合框架的核心概念,包括List接口、Collections工具类以及Comparator接口。理解这些知识点对于编写高效、灵活的Java代码至关重要。

    关于list的排序

    `Collections.sort()`方法可以对任何实现了`List`接口的对象进行排序,它默认使用元素的自然顺序(即元素所属类必须实现`Comparable`接口)。 首先,让我们了解一下`Collections.sort()`的基本用法。假设我们有一个...

    比较器工具类

    Collections.sort(list, Comparator.reverseOrder()); ``` ### 7. 自定义对象排序 对于自定义类,如果希望其实例能直接参与自然排序,可以在类中实现`Comparable&lt;T&gt;`接口。不过,当需要特殊排序逻辑时,使用`...

Global site tag (gtag.js) - Google Analytics