1.Arrays和List中sort方法的区别
Arrays和List都有sort方法,首先说他们两个的区别,从包名就可以看出来,一个是针对数组的,一个是针对List集合的。其中,List集合的实现类所有实现类:AbstractList,
AbstractSequentialList,
ArrayList,
AttributeList,
CopyOnWriteArrayList,
LinkedList,
RoleList,
RoleUnresolvedList,
Stack,
Vector
1.Arrays中sort方法的用法
我们从数据手册中可以看到,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+","); } } }
|
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+","); } } }
|
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+","); } } }
|
2.List中sort方法的用法
我们可以看到,List的sort方法和Arrays第三种泛型排序是一样的,自定义Comparator
比较器
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+","); } } }
|
- 采用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+","); } } }
|