@@ -92,15 +92,15 @@ public static <T> void reverse(T[] source, int start, int end) {
9292 }
9393 }
9494
95- public static <T extends Comparable <T >> void sort (T [] arr ) {
95+ public static <T extends Comparable <? super T >> void sort (T [] arr ) {
9696 sort (Comparable ::compareTo , arr , 0 , arr .length - 1 );
9797 }
9898
99- public static <T > void sort (T [] arr , Comparator <T > comparator ) {
99+ public static <T > void sort (T [] arr , Comparator <? super T > comparator ) {
100100 sort (comparator , arr , 0 , arr .length - 1 );
101101 }
102102
103- private static <T > void sort (Comparator <T > comparator , T [] arr , int start , int end ) {
103+ private static <T > void sort (Comparator <? super T > comparator , T [] arr , int start , int end ) {
104104 Preconditions .checkNotNull (arr , "arr should not be null" );
105105 Preconditions .checkNotNull (comparator , "comparator should not be null" );
106106 int length = end - start + 1 ;
@@ -113,11 +113,11 @@ private static <T> void sort(Comparator<T> comparator, T[] arr, int start, int e
113113 }
114114
115115
116- private static <T extends Comparable <T >> int partition (T [] arr , int start , int end ) {
116+ private static <T extends Comparable <? super T >> int partition (T [] arr , int start , int end ) {
117117 return partition (Comparable ::compareTo , arr , start , end );
118118 }
119119
120- public static <T > int partition (Comparator <T > comparator , T [] arr , int start , int end ) {
120+ public static <T > int partition (Comparator <? super T > comparator , T [] arr , int start , int end ) {
121121 int par_index = MathUtil .randInt (start , end );
122122 ArrayUtil .swap (arr , start , par_index );
123123 par_index = start ;
@@ -140,7 +140,7 @@ public static <T> int partition(Comparator<T> comparator, T[] arr, int start, in
140140 * @param <T>
141141 * @return
142142 */
143- public static <T extends Comparable <T >> T select (T [] arr , int k ) {
143+ public static <T extends Comparable <? super T >> T select (T [] arr , int k ) {
144144 Preconditions .checkNotNull (arr );
145145 Preconditions .checkPositionIndex (k , arr .length );
146146 int low = 0 ;
@@ -166,7 +166,7 @@ public static <T extends Comparable<T>> T select(T[] arr, int k) {
166166 * @param <T>
167167 * @return
168168 */
169- public <T extends Comparable <T >> int binarySearch (T [] arr , T ele ) {
169+ public <T extends Comparable <? super T >> int binarySearch (T [] arr , T ele ) {
170170 Preconditions .checkNotNull (arr );
171171 Preconditions .checkNotNull (ele );
172172 int low = 0 ;
@@ -192,13 +192,13 @@ public <T extends Comparable<T>> int binarySearch(T[] arr, T ele) {
192192 * @param comparator
193193 * @param <T>
194194 */
195- public static <T > void mergeSort (T [] arr , Comparator <T > comparator ) {
195+ public static <T > void mergeSort (T [] arr , Comparator <? super T > comparator ) {
196196 Preconditions .checkNotNull (arr );
197197 Preconditions .checkNotNull (comparator );
198198 mergeSort (arr , comparator , 0 , arr .length - 1 );
199199 }
200200
201- private static <T > void mergeSort (T [] arr , Comparator <T > comparator , int start , int end ) {
201+ private static <T > void mergeSort (T [] arr , Comparator <? super T > comparator , int start , int end ) {
202202 if (start < end ) {
203203 int middle = (end + start ) / 2 ;
204204 mergeSort (arr , comparator , start , middle );
@@ -207,10 +207,11 @@ private static <T> void mergeSort(T[] arr, Comparator<T> comparator, int start,
207207 }
208208 }
209209
210- private static <T > void merge (T [] arr , int start , int middle , int end , Comparator <T > comparator ) {
210+ private static <T > void merge (T [] arr , int start , int middle , int end , Comparator <? super T > comparator ) {
211211 int front_start = start ;
212212 int end_start = middle + 1 ;
213213 int cur_pos = 0 ;
214+ @ SuppressWarnings ("unchecked" )
214215 T [] helper = (T []) new Object [end - start + 1 ];
215216 while (front_start <= middle && end_start <= end ) {
216217 if (comparator .compare (arr [front_start ], arr [end_start ]) <= 0 ) {
@@ -256,7 +257,7 @@ public static void countSort(int[] arr, int start, int end) {
256257 System .arraycopy (result , 0 , arr , 0 , arr .length );
257258 }
258259
259- public static <T > void radixSort (T [] arr , Comparator <T > comparator ) {
260+ public static <T > void radixSort (T [] arr , Comparator <? extends T > comparator ) {
260261 //todo 完成基数排序
261262 }
262263
@@ -310,7 +311,7 @@ public static int[] bitMapSort(int[] un_sort_list) {
310311 * @param <T>
311312 * @return
312313 */
313- public static <T extends Comparable <T >> T minInRotate (T [] arr ) {
314+ public static <T extends Comparable <? super T >> T minInRotate (T [] arr ) {
314315 Preconditions .checkNotNull (arr );
315316 if (arr .length == 0 ) {
316317 return null ;
@@ -336,13 +337,13 @@ public static <T extends Comparable<T>> T minInRotate(T[] arr) {
336337 return arr [mid ];
337338 }
338339
339- public static <T > T [] group (T [] arr , Function <T , Integer > func ) {
340+ public static <T > T [] group (T [] arr , Function <? super T , ? extends Integer > func ) {
340341 Preconditions .checkNotNull (arr );
341342 Preconditions .checkNotNull (func );
342343 TreeMap <Integer , HashSet <T >> static_map = new TreeMap <>();
343344 for (T ele : arr ) {
344- Preconditions . checkNotNull (ele );
345- int group_num = func . apply ( ele );
345+ Integer group_num = func . apply (ele );
346+ Preconditions . checkNotNull ( group_num );
346347 HashSet <T > set = static_map .get (group_num );
347348 if (set == null ) {
348349 set = new HashSet <>();
@@ -452,7 +453,7 @@ private static <T> boolean checkMoreThanHalf(T[] arr, T most_ele) {
452453 * @param <T>
453454 * @return
454455 */
455- public static <T extends Comparable <T >> int countEle (T [] arr , T ele ) {
456+ public static <T extends Comparable <? super T >> int countEle (T [] arr , T ele ) {
456457 Preconditions .checkNotNull (arr );
457458 Preconditions .checkNotNull (ele );
458459 int start = getFirstEle (arr , ele );
@@ -468,7 +469,7 @@ public static <T extends Comparable<T>> int countEle(T[] arr, T ele) {
468469 * @param <T>
469470 * @return
470471 */
471- public static <T extends Comparable <T >> int getFirstEle (T [] arr , T ele ) {
472+ public static <T extends Comparable <? super T >> int getFirstEle (T [] arr , T ele ) {
472473 Preconditions .checkNotNull (arr );
473474 Preconditions .checkNotNull (ele );
474475 int start = 0 ;
@@ -499,7 +500,7 @@ public static <T extends Comparable<T>> int getFirstEle(T[] arr, T ele) {
499500 * @param <T>
500501 * @return
501502 */
502- public static <T extends Comparable <T >> int getLastEle (T [] arr , T ele ) {
503+ public static <T extends Comparable <? super T >> int getLastEle (T [] arr , T ele ) {
503504 Preconditions .checkNotNull (arr );
504505 Preconditions .checkNotNull (ele );
505506 int start = 0 ;
0 commit comments