8030848: Collections.sort(List l, Comparator) should defer to List.sort(Comparator )
Reviewed-by: mduigou
--- a/jdk/src/share/classes/java/util/Arrays.java Wed Jan 15 11:29:47 2014 -0800
+++ b/jdk/src/share/classes/java/util/Arrays.java Thu Jan 16 10:27:57 2014 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -1427,12 +1427,14 @@
* found to violate the {@link Comparator} contract
*/
public static <T> void sort(T[] a, Comparator<? super T> c) {
- if (c == null)
- c = NaturalOrder.INSTANCE;
- if (LegacyMergeSort.userRequested)
- legacyMergeSort(a, c);
- else
- TimSort.sort(a, 0, a.length, c, null, 0, 0);
+ if (c == null) {
+ sort(a);
+ } else {
+ if (LegacyMergeSort.userRequested)
+ legacyMergeSort(a, c);
+ else
+ TimSort.sort(a, 0, a.length, c, null, 0, 0);
+ }
}
/** To be removed in a future release. */
@@ -1498,13 +1500,15 @@
*/
public static <T> void sort(T[] a, int fromIndex, int toIndex,
Comparator<? super T> c) {
- if (c == null)
- c = NaturalOrder.INSTANCE;
- rangeCheck(a.length, fromIndex, toIndex);
- if (LegacyMergeSort.userRequested)
- legacyMergeSort(a, fromIndex, toIndex, c);
- else
- TimSort.sort(a, fromIndex, toIndex, c, null, 0, 0);
+ if (c == null) {
+ sort(a, fromIndex, toIndex);
+ } else {
+ rangeCheck(a.length, fromIndex, toIndex);
+ if (LegacyMergeSort.userRequested)
+ legacyMergeSort(a, fromIndex, toIndex, c);
+ else
+ TimSort.sort(a, fromIndex, toIndex, c, null, 0, 0);
+ }
}
/** To be removed in a future release. */
--- a/jdk/src/share/classes/java/util/Collections.java Wed Jan 15 11:29:47 2014 -0800
+++ b/jdk/src/share/classes/java/util/Collections.java Thu Jan 16 10:27:57 2014 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -121,34 +121,9 @@
*
* <p>The specified list must be modifiable, but need not be resizable.
*
- * <p>Implementation note: This implementation is a stable, adaptive,
- * iterative mergesort that requires far fewer than n lg(n) comparisons
- * when the input array is partially sorted, while offering the
- * performance of a traditional mergesort when the input array is
- * randomly ordered. If the input array is nearly sorted, the
- * implementation requires approximately n comparisons. Temporary
- * storage requirements vary from a small constant for nearly sorted
- * input arrays to n/2 object references for randomly ordered input
- * arrays.
- *
- * <p>The implementation takes equal advantage of ascending and
- * descending order in its input array, and can take advantage of
- * ascending and descending order in different parts of the same
- * input array. It is well-suited to merging two or more sorted arrays:
- * simply concatenate the arrays and sort the resulting array.
- *
- * <p>The implementation was adapted from Tim Peters's list sort for Python
- * (<a href="http://svn.python.org/projects/python/trunk/Objects/listsort.txt">
- * TimSort</a>). It uses techniques from Peter McIlroy's "Optimistic
- * Sorting and Information Theoretic Complexity", in Proceedings of the
- * Fourth Annual ACM-SIAM Symposium on Discrete Algorithms, pp 467-474,
- * January 1993.
- *
- * <p>This implementation dumps the specified list into an array, sorts
- * the array, and iterates over the list resetting each element
- * from the corresponding position in the array. This avoids the
- * n<sup>2</sup> log(n) performance that would result from attempting
- * to sort a linked list in place.
+ * @implNote
+ * This implementation defers to the {@link List#sort(Comparator)}
+ * method using the specified list and a {@code null} comparator.
*
* @param <T> the class of the objects in the list
* @param list the list to be sorted.
@@ -159,16 +134,11 @@
* @throws IllegalArgumentException (optional) if the implementation
* detects that the natural ordering of the list elements is
* found to violate the {@link Comparable} contract
+ * @see List#sort(Comparator)
*/
@SuppressWarnings("unchecked")
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 (Object e : a) {
- i.next();
- i.set((T) e);
- }
+ list.sort(null);
}
/**
@@ -183,34 +153,9 @@
*
* <p>The specified list must be modifiable, but need not be resizable.
*
- * <p>Implementation note: This implementation is a stable, adaptive,
- * iterative mergesort that requires far fewer than n lg(n) comparisons
- * when the input array is partially sorted, while offering the
- * performance of a traditional mergesort when the input array is
- * randomly ordered. If the input array is nearly sorted, the
- * implementation requires approximately n comparisons. Temporary
- * storage requirements vary from a small constant for nearly sorted
- * input arrays to n/2 object references for randomly ordered input
- * arrays.
- *
- * <p>The implementation takes equal advantage of ascending and
- * descending order in its input array, and can take advantage of
- * ascending and descending order in different parts of the same
- * input array. It is well-suited to merging two or more sorted arrays:
- * simply concatenate the arrays and sort the resulting array.
- *
- * <p>The implementation was adapted from Tim Peters's list sort for Python
- * (<a href="http://svn.python.org/projects/python/trunk/Objects/listsort.txt">
- * TimSort</a>). It uses techniques from Peter McIlroy's "Optimistic
- * Sorting and Information Theoretic Complexity", in Proceedings of the
- * Fourth Annual ACM-SIAM Symposium on Discrete Algorithms, pp 467-474,
- * January 1993.
- *
- * <p>This implementation dumps the specified list into an array, sorts
- * the array, and iterates over the list resetting each element
- * from the corresponding position in the array. This avoids the
- * n<sup>2</sup> log(n) performance that would result from attempting
- * to sort a linked list in place.
+ * @implNote
+ * This implementation defers to the {@link List#sort(Comparator)}
+ * method using the specified list and comparator.
*
* @param <T> the class of the objects in the list
* @param list the list to be sorted.
@@ -223,16 +168,11 @@
* list-iterator does not support the {@code set} operation.
* @throws IllegalArgumentException (optional) if the comparator is
* found to violate the {@link Comparator} contract
+ * @see List#sort(Comparator)
*/
@SuppressWarnings({"unchecked", "rawtypes"})
public static <T> void sort(List<T> list, Comparator<? super T> c) {
- Object[] a = list.toArray();
- Arrays.sort(a, (Comparator)c);
- ListIterator<T> i = list.listIterator();
- for (Object e : a) {
- i.next();
- i.set((T) e);
- }
+ list.sort(c);
}
@@ -4464,10 +4404,12 @@
* <pre>
* List<String> s = Collections.emptyList();
* </pre>
- * Implementation note: Implementations of this method need not
- * create a separate <tt>List</tt> object for each call. Using this
- * method is likely to have comparable cost to using the like-named
- * field. (Unlike this method, the field does not provide type safety.)
+ *
+ * @implNote
+ * Implementations of this method need not create a separate <tt>List</tt>
+ * object for each call. Using this method is likely to have comparable
+ * cost to using the like-named field. (Unlike this method, the field does
+ * not provide type safety.)
*
* @param <T> type of elements, if there were any, in the list
* @return an empty immutable list
--- a/jdk/src/share/classes/java/util/List.java Wed Jan 15 11:29:47 2014 -0800
+++ b/jdk/src/share/classes/java/util/List.java Thu Jan 16 10:27:57 2014 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -415,11 +415,49 @@
}
/**
- * Sorts this list using the supplied {@code Comparator} to compare elements.
+ * Sorts this list according to the order induced by the specified
+ * {@link Comparator}.
+ *
+ * <p>All elements in this list must be <i>mutually comparable</i> using the
+ * specified comparator (that is, {@code c.compare(e1, e2)} must not throw
+ * a {@code ClassCastException} for any elements {@code e1} and {@code e2}
+ * in the list).
+ *
+ * <p>If the specified comparator is {@code null} then all elements in this
+ * list must implement the {@link Comparable} interface and the elements'
+ * {@linkplain Comparable natural ordering} should be used.
+ *
+ * <p>This list must be modifiable, but need not be resizable.
*
* @implSpec
- * The default implementation is equivalent to, for this {@code list}:
- * <pre>Collections.sort(list, c)</pre>
+ * The default implementation obtains an array containing all elements in
+ * this list, sorts the array, and iterates over this list resetting each
+ * element from the corresponding position in the array. (This avoids the
+ * n<sup>2</sup> log(n) performance that would result from attempting
+ * to sort a linked list in place.)
+ *
+ * @implNote
+ * This implementation is a stable, adaptive, iterative mergesort that
+ * requires far fewer than n lg(n) comparisons when the input array is
+ * partially sorted, while offering the performance of a traditional
+ * mergesort when the input array is randomly ordered. If the input array
+ * is nearly sorted, the implementation requires approximately n
+ * comparisons. Temporary storage requirements vary from a small constant
+ * for nearly sorted input arrays to n/2 object references for randomly
+ * ordered input arrays.
+ *
+ * <p>The implementation takes equal advantage of ascending and
+ * descending order in its input array, and can take advantage of
+ * ascending and descending order in different parts of the same
+ * input array. It is well-suited to merging two or more sorted arrays:
+ * simply concatenate the arrays and sort the resulting array.
+ *
+ * <p>The implementation was adapted from Tim Peters's list sort for Python
+ * (<a href="http://svn.python.org/projects/python/trunk/Objects/listsort.txt">
+ * TimSort</a>). It uses techniques from Peter McIlroy's "Optimistic
+ * Sorting and Information Theoretic Complexity", in Proceedings of the
+ * Fourth Annual ACM-SIAM Symposium on Discrete Algorithms, pp 467-474,
+ * January 1993.
*
* @param c the {@code Comparator} used to compare list elements.
* A {@code null} value indicates that the elements'
@@ -434,8 +472,15 @@
* contract
* @since 1.8
*/
+ @SuppressWarnings({"unchecked", "rawtypes"})
default void sort(Comparator<? super E> c) {
- Collections.sort(this, c);
+ Object[] a = this.toArray();
+ Arrays.sort(a, (Comparator) c);
+ ListIterator<E> i = this.listIterator();
+ for (Object e : a) {
+ i.next();
+ i.set((E) e);
+ }
}
/**