Arrays.sort和Collections.sort排序基本用法
00在算法中经常会对数组或者集合进行排序,可以直接使用包装的sort方法进行排序,同时在使用的时候也有很多注意事项
一、一维基本数据类型的数组进行排序:
int[] nums = {2, 3, 0, -1, 5};
Arrays.sort(nums);
for (int num : nums) {
System.out.print(num + " "); //-1 0 2 3 5
}
二、二维基本数据类型的数组进行排序:
//根据二维数组每行的第一个数对数组进行升序排序
Arrays.sort(nums, (a, b) -> a[0] - b[0]);
Arrays.sort(nums, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
return o1[0] - o2[0];
}
});
//先根据二维数组每行的第一个数对数组进行升序排序,在第一个数相同的情况下再根据第二个数进行升序排序
Arrays.sort(nums, (a,b) -> a[0] == b[0] ? a[1] - b[1] : a[0] - b[0]);
Arrays.sort(ints, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
if (o1[0] == o2[0]) {
return o1[1] - o2[1];
} else {
return o1[0] - o2[0];
}
}
});
注意:二(多)维数组的排序不能直接使用 Arrays.sort(nums),因为sort方法底层使用的 compare 方法是通过将对象转换为 Comparable,并使用其内部 compareTo 方法进行比较的,数据类型都是实现了 Comparable 接口,可实现对象转换,但二维数组对于单个的数据而言是 int[] 数组类型,无法实现到 Comparable的转换,使用会出现以下报错:java.lang.ClassCastException: [I cannot be cast to java.lang.Comparable]
多维数组可通过实现自定义 Comparable 的 compare 方法即可排序
三、自定义类的数组排序
Person[] people = new Person[2];
people[0] = new Person("1");
people[1] = new Person("2");
Arrays.sort(people, new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
//return o1.getAge() - o2.getAge();
return o1.getName().compareTo(o2.getName());
}
});
自定义类进行排序时只需要重写 compare 方法并将排序的标准在方法中体现即可,注意基本数据类型的拆箱类型只能使用运算符,装箱类型可以使用运算符和 compareTo 方法,而String类型只能使用 compareTo 方法
四、基本数据类型的List集合进行排序
ArrayList<Integer> list = new ArrayList<>();
Collections.sort(list);
Collections.sort(list, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o1 - o2;
}
});
Collections.sort 底层也是调用的 Array.sort 方法,通过将集合转换为数组再进行排序,同样也需要注意 Array.sort 可能会出现的类型转换和空指针问题
五、自定义类的集合排序
ArrayList<Person> list = new ArrayList<>();
Collections.sort(list, new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
return o1.getAge() - o2.getAge();
}
});
六、基本数据类型的Map集合排序
HashMap<Integer, Integer> map = new HashMap<>();
List<Map.Entry<String, Integer>> list = new ArrayList<>(map.entrySet());
Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() {
@Override
public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
if (o1.getValue() != o2.getValue()) {
return o2.getValue().compareTo(o1.getValue()); //降序
}else {
return o1.getKey().compareTo(o2.getKey()); //升序
}
}
});
七、List数组排序
List<Integer>[] arrayLists = new ArrayList[2];
Arrays.sort(arrayLists, new Comparator<List<Integer>>() {
@Override
public int compare(List<Integer> o1, List<Integer> o2) {
return o1.get(0) - o2.get(0);
}
});
注意:传递的类型为非基本类型时需要注意数组初始化,因为底层需要调用 compareTo 方法,如果非基本类型默认初始值为null,则会出现空指针异常
八、Map数组排序
HashMap<Integer, Integer>[] maps = new HashMap[2];
Arrays.sort(maps, new Comparator<HashMap<Integer, Integer>>() {
@Override
public int compare(HashMap<Integer, Integer> o1, HashMap<Integer, Integer> o2) {
return o1.getOrDefault(0, -1) - o2.getOrDefault(0, -1);
}
});
注意 Map 数组排序是需要根据 maps[0] 中的某个已存在的数据和 maps[1] 中某个已存在的数据进行比较排序
同理多维数组的排序都不能直接使用 Arrays.sort(lists)
总结:
- 数组使用 Arrays.sort() 方法进行排序,集合使用 Collections.sort() 方法进行排序
- 在使用 Comparator 类的 compare 方法自定义排序时,基本数据类型的拆箱类型只能使用运算符,装箱类型可以使用运算符和 compareTo 方法,而String类型只能使用 compareTo 方法
- 在对Map集合进行排序时,需要先将其转化为 List<Map.Entry<String, Integer>> 类型
- 多维数组不能使用
Arrays.sort(nums)方式 - 传递的类型为非基本类型时需要注意数组初始化,因为底层需要调用 compareTo 方法,如果非基本类型默认初始值为null,则会出现空指针异常