欢迎访问宙启技术站
智能推送

Java中数组排序函数sort的用法包括自定义排序方法

发布时间:2023-05-20 10:34:50

Java中的Arrays类提供了许多有用的数组操作方法,其中包括对数组进行排序的方法sort。sort方法可以对数组进行升序或降序排序,以及对自定义的对象进行排序。本文将详细介绍sort方法的用法,包括自定义排序方法。

1. 对基本数据类型数组排序

对基本数据类型数组进行排序非常简单,只需要调用sort方法即可。sort方法有两个重载,一个接收数组参数,一个接收数组和排序方式(升序或降序)两个参数。

示例代码如下:

int[] arr = {3, 7, 1, 9, 2};
Arrays.sort(arr); // 升序排序
System.out.println(Arrays.toString(arr)); // [1, 2, 3, 7, 9]

Arrays.sort(arr, Collections.reverseOrder()); // 降序排序
System.out.println(Arrays.toString(arr)); // [9, 7, 3, 2, 1]

2. 对对象数组排序

对对象数组排序需要借助于Comparable接口,该接口定义了一个compareTo方法,该方法将对象与另一个对象进行比较。将数组中的对象实现Comparable接口,然后调用sort方法即可对对象数组进行排序。

示例代码如下:

class Student implements Comparable<Student> {
    private String name;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public int compareTo(Student o) {
        return this.age - o.getAge();
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

public class Main {
    public static void main(String[] args) {
        Student[] students = new Student[3];
        students[0] = new Student();
        students[0].setName("Tom");
        students[0].setAge(18);

        students[1] = new Student();
        students[1].setName("Jerry");
        students[1].setAge(20);

        students[2] = new Student();
        students[2].setName("Bob");
        students[2].setAge(16);

        Arrays.sort(students);

        System.out.println(Arrays.toString(students));
    }
}

输出结果:

[Student{name='Bob', age=16}, Student{name='Tom', age=18}, Student{name='Jerry', age=20}]

可以看到,对象数组已经按照年龄进行了升序排序。如果要进行降序排序,则需要稍微修改一下compareTo方法:

@Override
public int compareTo(Student o) {
    return o.getAge() - this.age; // 降序排序
}

3. 对复杂对象数组排序

如果要对复杂对象数组排序,则需要借助于Comparator接口,该接口定义了一个compare方法,用于定义排序规则。与实现Comparable接口不同的是,实现Comparator接口的类是单独的类,而不是数组中的对象,需要将Comparator对象传递给sort方法。

示例代码如下:

class Student {
    private String name;
    private int age;
    private float score;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public float getScore() {
        return score;
    }

    public void setScore(float score) {
        this.score = score;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", score=" + score +
                '}';
    }
}

class ScoreComparator implements Comparator<Student> {

    @Override
    public int compare(Student o1, Student o2) {
        return Float.compare(o2.getScore(), o1.getScore());
    }
}

public class Main {
    public static void main(String[] args) {
        Student[] students = new Student[3];
        students[0] = new Student();
        students[0].setName("Tom");
        students[0].setAge(18);
        students[0].setScore(90.0f);

        students[1] = new Student();
        students[1].setName("Jerry");
        students[1].setAge(20);
        students[1].setScore(80.0f);

        students[2] = new Student();
        students[2].setName("Bob");
        students[2].setAge(16);
        students[2].setScore(85.0f);

        Arrays.sort(students, new ScoreComparator());

        System.out.println(Arrays.toString(students));
    }
}

输出结果:

[Student{name='Tom', age=18, score=90.0}, Student{name='Bob', age=16, score=85.0}, Student{name='Jerry', age=20, score=80.0}]

可以看到,对象数组已经按照分数进行了降序排序。

4. 自定义排序方法

有时候我们需要对数组中的对象按照多个属性进行排序,此时可以采用自定义排序方法。自定义排序方法需要通过Comparator接口实现compare方法来定义排序规则。例如,对Student对象按照姓名和年龄进行排序:

class NameAndAgeComparator implements Comparator<Student> {
    @Override
    public int compare(Student o1, Student o2) {
        int result = o1.getName().compareTo(o2.getName());

        if (result == 0) {
            result = Integer.compare(o1.getAge(), o2.getAge());
        }

        return result;
    }
}

其中,首先按照姓名进行比较,如果相同则按照年龄进行比较。

示例代码如下:

public class Main {
    public static void main(String[] args) {
        Student[] students = new Student[3];
        students[0] = new Student();
        students[0].setName("Bob");
        students[0].setAge(16);

        students[1] = new Student();
        students[1].setName("Jerry");
        students[1].setAge(20);

        students[2] = new Student();
        students[2].setName("Tom");
        students[2].setAge(18);

        Arrays.sort(students, new NameAndAgeComparator());

        System.out.println(Arrays.toString(students));
    }
}

输出结果:

[Student{name='Bob', age=16}, Student{name='Jerry', age=20}, Student{name='Tom', age=18}]

可以看到,对象数组已经按照姓名和年龄进行了排序。

综上所述,Java中的sort方法可以对基本数据类型和对象进行排序,还可以通过实现Comparable或Comparator接口来自定义排序方法。使用sort方法可以方便地对数组进行排序,提高程序的运行效率。