使用Collections的静态方法sort时,一定要实现Comparable的compareTo方法吗?

解决方案 »

  1.   

    看一下源代码:sort有两种用法:
    1.  public static <T extends Comparable<? super T>> void sort(List<T> list) {
    Object[] a = list.toArray();
    Arrays.sort(a);
    ListIterator<T> i = list.listIterator();
    for (int j=0; j<a.length; j++) {
        i.next();
        i.set((T)a[j]);
    }
        }
    2.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]);
    }
        }
    第一种必须实现实现Comparable的compareTo方法,第二种就不需要了。
      

  2.   

    需要,而且元素还必须是可以比较的。sort
    public static <T extends Comparable<? super T>> void sort(List<T> list)根据元素的自然顺序 对指定列表按升序进行排序。列表中的所有元素都必须实现 Comparable 接口。此外,列表中的所有元素都必须是可相互比较的(也就是说,对于列表中的任何 e1 和 e2 元素,e1.compareTo(e2) 不得抛出 ClassCastException)。
    (------------jdk1.6)
    楼主可以查看jdk的文档。
      

  3.   

    sort
    public static <T extends Comparable<? super T>> void sort(List<T> list)根据元素的自然顺序 对指定列表按升序进行排序。列表中的所有元素都必须实现 Comparable 接口。此外,列表中的所有元素都必须是可相互比较的(也就是说,对于列表中的任何 e1 和 e2 元素,e1.compareTo(e2) 不得抛出 ClassCastException)。
    此排序方法具有稳定性:不会因调用 sort 方法而对相等的元素进行重新排序。指定列表必须是可修改的,但不必是大小可调整的。该排序算法是一个经过修改的合并排序算法(其中,如果低子列表中的最高元素小于高子列表中的最低元素,则忽略合并)。此算法提供可保证的 n log(n) 性能。 此实现将指定列表转储到一个数组中,并对数组进行排序,在重置数组中相应位置处每个元素的列表上进行迭代。这避免了由于试图原地对链接列表进行排序而产生的 n2 log(n) 性能。 
    参数:
    list - 要排序的列表。 
    抛出: 
    ClassCastException - 如果列表包含不可相互比较 的元素(例如,字符串和整数)。 
    UnsupportedOperationException - 如果指定列表的列表迭代器不支持 set 操作。
    另请参见:
    Comparable
    sort
    public static <T> void sort(List<T> list,
                                Comparator<? super T> c)根据指定比较器产生的顺序对指定列表进行排序。此列表内的所有元素都必须可使用指定比较器相互比较(也就是说,对于列表中的任意 e1 和 e2 元素,c.compare(e1, e2) 不得抛出 ClassCastException)。
    此排序被保证是稳定的:不会因调用 sort 而对相等的元素进行重新排序。排序算法是一个经过修改的合并排序算法(其中,如果低子列表中的最高元素小于高子列表中的最低元素,则忽略合并)。此算法提供可保证的 n log(n) 性能。 指定列表必须是可修改的,但不必是可大小调整的。此实现将指定列表转储到一个数组中,并对数组进行排序,在重置数组中相应位置每个元素的列表上进行迭代。这避免了由于试图原地对链接列表进行排序而产生的 n2 log(n) 性能。 
    参数:
    list - 要排序的列表。
    c - 确定列表顺序的比较器。null 值指示应该使用元素的自然顺序。 
    抛出: 
    ClassCastException - 如果列表中包含不可使用指定比较器相互比较 的元素。 
    UnsupportedOperationException - 如果指定列表的列表迭代器不支持 set 操作。
    另请参见:
    Comparator