@@ -92,15 +92,15 @@ public static <T> void reverse(T[] source, int start, int end) {
92
92
}
93
93
}
94
94
95
- public static <T extends Comparable <T >> void sort (T [] arr ) {
95
+ public static <T extends Comparable <? super T >> void sort (T [] arr ) {
96
96
sort (Comparable ::compareTo , arr , 0 , arr .length - 1 );
97
97
}
98
98
99
- public static <T > void sort (T [] arr , Comparator <T > comparator ) {
99
+ public static <T > void sort (T [] arr , Comparator <? super T > comparator ) {
100
100
sort (comparator , arr , 0 , arr .length - 1 );
101
101
}
102
102
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 ) {
104
104
Preconditions .checkNotNull (arr , "arr should not be null" );
105
105
Preconditions .checkNotNull (comparator , "comparator should not be null" );
106
106
int length = end - start + 1 ;
@@ -113,11 +113,11 @@ private static <T> void sort(Comparator<T> comparator, T[] arr, int start, int e
113
113
}
114
114
115
115
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 ) {
117
117
return partition (Comparable ::compareTo , arr , start , end );
118
118
}
119
119
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 ) {
121
121
int par_index = MathUtil .randInt (start , end );
122
122
ArrayUtil .swap (arr , start , par_index );
123
123
par_index = start ;
@@ -140,7 +140,7 @@ public static <T> int partition(Comparator<T> comparator, T[] arr, int start, in
140
140
* @param <T>
141
141
* @return
142
142
*/
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 ) {
144
144
Preconditions .checkNotNull (arr );
145
145
Preconditions .checkPositionIndex (k , arr .length );
146
146
int low = 0 ;
@@ -166,7 +166,7 @@ public static <T extends Comparable<T>> T select(T[] arr, int k) {
166
166
* @param <T>
167
167
* @return
168
168
*/
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 ) {
170
170
Preconditions .checkNotNull (arr );
171
171
Preconditions .checkNotNull (ele );
172
172
int low = 0 ;
@@ -192,13 +192,13 @@ public <T extends Comparable<T>> int binarySearch(T[] arr, T ele) {
192
192
* @param comparator
193
193
* @param <T>
194
194
*/
195
- public static <T > void mergeSort (T [] arr , Comparator <T > comparator ) {
195
+ public static <T > void mergeSort (T [] arr , Comparator <? super T > comparator ) {
196
196
Preconditions .checkNotNull (arr );
197
197
Preconditions .checkNotNull (comparator );
198
198
mergeSort (arr , comparator , 0 , arr .length - 1 );
199
199
}
200
200
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 ) {
202
202
if (start < end ) {
203
203
int middle = (end + start ) / 2 ;
204
204
mergeSort (arr , comparator , start , middle );
@@ -207,10 +207,11 @@ private static <T> void mergeSort(T[] arr, Comparator<T> comparator, int start,
207
207
}
208
208
}
209
209
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 ) {
211
211
int front_start = start ;
212
212
int end_start = middle + 1 ;
213
213
int cur_pos = 0 ;
214
+ @ SuppressWarnings ("unchecked" )
214
215
T [] helper = (T []) new Object [end - start + 1 ];
215
216
while (front_start <= middle && end_start <= end ) {
216
217
if (comparator .compare (arr [front_start ], arr [end_start ]) <= 0 ) {
@@ -256,7 +257,7 @@ public static void countSort(int[] arr, int start, int end) {
256
257
System .arraycopy (result , 0 , arr , 0 , arr .length );
257
258
}
258
259
259
- public static <T > void radixSort (T [] arr , Comparator <T > comparator ) {
260
+ public static <T > void radixSort (T [] arr , Comparator <? extends T > comparator ) {
260
261
//todo 完成基数排序
261
262
}
262
263
@@ -310,7 +311,7 @@ public static int[] bitMapSort(int[] un_sort_list) {
310
311
* @param <T>
311
312
* @return
312
313
*/
313
- public static <T extends Comparable <T >> T minInRotate (T [] arr ) {
314
+ public static <T extends Comparable <? super T >> T minInRotate (T [] arr ) {
314
315
Preconditions .checkNotNull (arr );
315
316
if (arr .length == 0 ) {
316
317
return null ;
@@ -336,13 +337,13 @@ public static <T extends Comparable<T>> T minInRotate(T[] arr) {
336
337
return arr [mid ];
337
338
}
338
339
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 ) {
340
341
Preconditions .checkNotNull (arr );
341
342
Preconditions .checkNotNull (func );
342
343
TreeMap <Integer , HashSet <T >> static_map = new TreeMap <>();
343
344
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 );
346
347
HashSet <T > set = static_map .get (group_num );
347
348
if (set == null ) {
348
349
set = new HashSet <>();
@@ -452,7 +453,7 @@ private static <T> boolean checkMoreThanHalf(T[] arr, T most_ele) {
452
453
* @param <T>
453
454
* @return
454
455
*/
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 ) {
456
457
Preconditions .checkNotNull (arr );
457
458
Preconditions .checkNotNull (ele );
458
459
int start = getFirstEle (arr , ele );
@@ -468,7 +469,7 @@ public static <T extends Comparable<T>> int countEle(T[] arr, T ele) {
468
469
* @param <T>
469
470
* @return
470
471
*/
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 ) {
472
473
Preconditions .checkNotNull (arr );
473
474
Preconditions .checkNotNull (ele );
474
475
int start = 0 ;
@@ -499,7 +500,7 @@ public static <T extends Comparable<T>> int getFirstEle(T[] arr, T ele) {
499
500
* @param <T>
500
501
* @return
501
502
*/
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 ) {
503
504
Preconditions .checkNotNull (arr );
504
505
Preconditions .checkNotNull (ele );
505
506
int start = 0 ;
0 commit comments