一、数组排序
1.1 一维数组排序
使用Arrays.sort()来排序。
Arrays.sort(int[] a) ;排序数组a
Arrays.sort(int[] a, int l, int r) ;对从索引l -> r-1的数组a排序;
Arrays.sort(T[] a, Comparator<? Super T> c) ;用Comparator接口实现自定义排序规则
import java.util.*;
public class Sort {
public static void main(String[] str){
Integer[] arr=new Integer[]{3,1,5,4,8,6,9,0,23,54,76};
Arrays.sort(arr,0,5); //排序前四个
for(int i=0;i<arr.length;i++){
System.out.print(arr[i]+" ");
}
System.out.println("");
Arrays.sort(arr);
for(int i=0;i<arr.length;i++){
System.out.print(arr[i]+" ");
}
System.out.println("");
//Arrays.sort(arr, Collections.reverseOrder()); //逆序输出,和下面相同
Arrays.sort(arr, new Comparator<Integer>() {
public int compare(Integer o1, Integer o2) {
return o2 - o1;
}
}); //从大到小排序,需用Integer来声明数组,外部比较器这在下面总结
for(int i : arr){
System.out.print(i+" ");
}
}
}
运行结果:
1 3 4 5 8 6 9 0 23 54 76
0 1 3 4 5 6 8 9 23 54 76
76 54 23 9 8 6 5 4 3 1 0
1.2二维数组排序
1.2.1 比较器
Comparable内部比较器
是一个接口,可以用于实现类的对象之间的自然排序。
要使用Comparable接口,需要实现它的compareTo方法,该方法接受一个类型为T的对象作为参数,返回一个整数值。这个返回值指示了当前对象和参数对象的大小关系,如果返回值为负数,则表示当前对象小于参数对象;如果返回值为0,则表示两个对象相等;如果返回值为正数,则表示当前对象大于参数对象。
public class Person implements Comparable<Person>{
private int age;
//构造方法
public Person(int age){
this.age = age;
}
//实现compareTo方法
public int compareTo(Person p){
return this.age - p.age;
}
}
在上面的例子中,compareTo方法比较两个Person对象的年龄属性,并返回一个整数值,指示了它们的大小关系。如果返回值为负数,则第一个对象小于第二个对象;如果返回值为0,则两个对象相等;如果返回值为正数,则第一个对象大于第二个对象。
使用内部比较器的好处是可以直接使用Java集合框架提供的排序函数Collections.sort()或Arrays.sort()来对对象集合进行排序,而不需要手动实现排序算法。例如,下面的代码将对一个Person对象的列表进行排序:
List<Person> people = new ArrayList<Person>();
people.add(new Person(30));
people.add(new Person(20));
people.add(new Person(40));
Collections.sort(people);
在上面的代码中,通过调用Collections.sort()方法对Person对象的列表进行排序,由于Person类实现了Comparable接口,因此可以直接使用该方法进行排序。排序结果将按照年龄升序排列。
Comparator,外部比较器
Comparator是Java中的外部比较器,用于比较对象之间的相对顺序。和Comparable接口不同,它不是定义在类中的,而是通过实现Comparator接口来创建比较器。
Comparator接口定义了一个compare方法,该方法接受两个类型为T的对象作为参数,返回一个整数值。和Comparable接口的compareTo方法类似,这个返回值指示了第一个对象和第二个对象的大小关系,如果返回值为负数,则第一个对象小于第二个对象;如果返回值为0,则两个对象相等;如果返回值为正数,则第一个对象大于第二个对象。
//对数组arr进行逆序排列
Arrays.sort(arr, new Comparator<Integer>() {
public int compare(Integer o1, Integer o2) {
return o2 - o1;
}
});
1.2.2 lambda表达式
Lambda表达式是Java 8中引入的一个新特性,它使得编写简洁、可读性高的代码更加容易。Lambda表达式本质上是一种匿名函数,它可以作为参数传递给方法,或者赋值给变量。
Lambda表达式的语法如下:
(parameters) -> expression
其中,参数列表指定了函数接受的参数,箭头"->"将参数列表和表达式分开,表达式指定了函数执行的操作。
2.二维数组排序
按行排序:
import java.util.Arrays;
public class Sort {
public static void main(String[] args) {
// 初始化二维数组
int[][] arr = {{3, 2, 1}, {6, 7, 5}, {19, 8, 7}};
// 对二维数组每行进行排序
for (int i = 0; i < arr.length; i++) {
Arrays.sort(arr[i]);
}
// 打印排序后的二维数组
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
System.out.print(arr[i][j] + " ");
}
System.out.println();
}
}
}
二、列表排序
Collections.sort()是Java中的一个静态方法,用于对实现了List接口的对象进行排序。它可以处理List集合中的元素,包括基本数据类型和对象。Collections.sort()方法使用TimSort算法,具有较高的性能。
import java.util.ArrayList;
import java.util.*;
public class Sort {
public static class People{
String name="";
Integer age;
public People(String name,int age){
this.name=name;
this.age=age;
}
}
public static void main(String[] args) {
ArrayList<Integer> list=new ArrayList<>();
list.add(3);
list.add(1);
list.add(5);
list.add(9);
list.add(2);
list.add(4);
Collections.sort(list);
System.out.println(list.toString());
ArrayList<People> plist=new ArrayList<>();//people类列表
plist.add(new People("lisi", 23));
plist.add(new People("zhan", 18));
plist.add(new People("wang", 20));
Collections.sort(plist,(p1,p2)->p1.age-p2.age);//从小到大排序
for (People p : plist){
System.out.println(p.age+" ");
}
}
}