1.Arrays和List中sort方法的区别

Arrays和List都有sort方法,首先说他们两个的区别,从包名就可以看出来,一个是针对数组的,一个是针对List集合的。其中,List集合的实现类所有实现类:AbstractListAbstractSequentialListArrayListAttributeListCopyOnWriteArrayListLinkedListRoleListRoleUnresolvedListStackVector

1.Arrays中sort方法的用法

image-20220528222839429

我们从数据手册中可以看到,sort()方法大致可以分为三类

1、基本类型排序

  • Arrays.sort(int[] a)
  • Arrays.sort(int[] a, int fromIndex, int toIndex)

这个包括byte、char、double、float、int、long和short,这些基本类型,只能按照从小到大的排序顺序从大到小排序需要通过泛型排序,并且要求数组是包装类型

是包装类。

也可以对指定范围内的部分数组排序,也就是对数组a的下标从fromIndex到toIndex-1的元素排序,注意:下标为toIndex的元素不参与排序!

例如:

1
2
3
4
5
6
7
8
9
10
11
12
import java.util.Arrays;

public class SortTest {
public static void main(String[] args) {
int[] arr = {1,4,6,8,5,5,7,8,9,6,4,4,33};
Arrays.sort(arr);
for (int i : arr) {
System.out.print(i+",");
}
}
}
//控制台输出 : 1,4,4,4,5,5,6,6,7,8,8,9,33,

2、包装类类型排序

  • Arrays.sort(Object[] a)
  • Arrays.sort(Object[] a, int fromIndex, int toIndex)

这个Object包括了Byte、Character、Double、Float、Integer、Long和Short,这些包装类,按照从小到大的排序顺序,并且容许自定义Object类排序,但这个要指定排序顺序。

1
2
3
4
5
6
7
8
9
10
11
import java.util.Arrays;
public class SortTest {
public static void main(String[] args) {
Integer[] arr = {1,4,6,8,5,5,7,8,9,6,4,4,33};
Arrays.sort(arr);
for (int i : arr) {
System.out.print(i+",");
}
}
}
//控制台输出 : 1,4,4,4,5,5,6,6,7,8,8,9,33,

3、泛型排序

  • static void sort(T[] a, Comparator<? super T> c)
  • public static void sort(T[] a,int fromIndex, int toIndex, Comparator<? super T> c)

注意,上面1和2中排列顺序只能是从小到大,并且可以是包装类,也可以是基本类型,但是,如果要自定义排序规则,比如从大到小,就要使用这种方式,这种方式只能放入包装类型

1
2
3
4
5
6
7
8
9
10
11
12
import java.util.Arrays;
//比如我们从大到小排序
public class SortTest {
public static void main(String[] args) {
Integer[] arr = {1,4,6,8,5,5,7,8,9,6,4,4,33};
Arrays.sort(arr,(o1,o2)->o2-o1);
for (int i : arr) {
System.out.print(i+",");
}
}
}
//控制台输出 :33,9,8,8,7,6,6,5,5,4,4,4,1,

2.List中sort方法的用法

我们可以看到,List的sort方法和Arrays第三种泛型排序是一样的,自定义Comparator比较器

image-20220529134112472

1
2
3
4
5
6
7
8
9
import java.util.*;
public class SortTest {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(1);list.add(13);list.add(21);list.add(11);list.add(5);
list.sort( (o1, o2) -> o2-o1 );
System.out.println(list);
}
}

这样写不熟悉Lambda表达式的同学可能不太明白,这样写可能就明白了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import java.util.*;
public class SortTest {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(1);list.add(13);list.add(21);list.add(11);list.add(5);
list.sort(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2-o1;
}
});
System.out.println(list);
}
}

如果想要重复利用这个排序,不采用匿名内部类定义的形式话

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import java.util.*;
public class SortTest {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(1);list.add(13);list.add(21);list.add(11);list.add(5);
Comparator myCom = new MyComparator();
list.sort(myCom);
System.out.println(list);
}
}
class MyComparator implements Comparator<Integer>{
@Override
public int compare(Integer o1, Integer o2) {
return o2-o1;
}
}

2.对基本数组类型降序排序

我把它总结为以下三种方式:

  • 先升序排序,然后把数组元素交换,这种做法最简单,但只适用一维数组降序排序
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import java.util.*;
public class SortTest {
public static void main(String[] args) {
int[] arr = {1,15,7,4,3,87,3};
Arrays.sort(arr);
for (int i = 0; i < arr.length/2; i++) {
int temp = arr[i];
arr[i] = arr[arr.length - 1 - i];
arr[arr.length - 1 - i] = temp;
}
for (int i : arr) {
System.out.print(i+",");
}
}
}
//控制台输出 :87,15,7,4,3,3,1,
  • 采用stream流的方式把他转化成Integer数组
1
2
3
4
5
6
7
8
9
10
11
12
import java.util.*;
public class SortTest {
public static void main(String[] args) {
int[] arr = {1,15,7,4,3,87,3};
Integer[] integerArr = Arrays.stream(arr).boxed().toArray(Integer[]::new);
Arrays.sort(integerArr,((o1, o2) -> o2-o1));
for (int i : integerArr) {
System.out.print(i+",");
}
}
}
//控制台输出 :87,15,7,4,3,3,1,
  • 直接自定义排序算法。写排序算法较为麻烦,这个省略