我的冒泡排序方法不排序。它一次又一次地写下同一个名字。它应该按年份对 Person(String name, int year) 进行排序

My bubble sort method does not sort. It writes the same name again and again. It should sort Person(String name, int year) by year

我是编程新手,正在学习课程。

在这个赋值中必须做一个class, Person(String name, int year)。 然后进行冒泡排序,按年份对 Person 对象进行排序。 我需要通过在按年份排序的控制台中写入名称来测试它。

我太卡了,同一个名字在控制台中写了 5 次。

public class Person {
    private static String name;
    private static int year;

    public Person(String name, int year) {
        super();
        Person.name = name;
        Person.year = year;
    }

    public static String getName() {
        return name;
    }

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

    public static int getYear() {
        return year;
    }

    public static void setYear(int year) {
        Person.year = year;
    }

    public static void bubbleSort(Person[] list) {
        boolean undone;

        do {
            undone = false;
            for (int i = 0; i < list.length - 1; i++) {
                for (int j = 0; j < list.length - 1; j++) {

                    if (list[j].getYear() > list[j + 1].getYear()) {
                        list[j] = list[j + 1];
                        list[j + 1] = list[j];

                        undone = true;
                    }
                }
            }
        } while (undone);
    }

    public static void printArray(Person[] myPerson) {
        int n = myPerson.length;
    
        for (int i = 0; i < n; ++i)
            System.out.println(myPerson[i].getName() + " ");
    }
}


public class MainPerson {

    public static void main(String[] args) {
        Person[] myPerson = new Person[] { new Person("Susanne Hansen", 1999), new Person("Hans Jespersen", 1896),
            new Person("Eva Gylden", 2789), new Person("Anders Aage", 1786), new Person("Ane Pulsar", 1345) };

        Person.bubbleSort(myPerson);
    
        Person.printArray(myPerson);
    }
}

这是根据您的需要生成输出的更新代码:

class Person {
    private  String name;
    private  int year;

    public Person(String name, int year) {
        this.name = name;
        this.year = year;
    }

    public  String getName() {
        return this.name;
    }

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

    public  int getYear() {
        return year;
    }

    public  void setYear(int year) {
        this.year = year;
    }

    
}


public class Main {
    
    public static void bubbleSort(Person[] list) {
        boolean undone;

        do {
            undone = false;
            for (int i = 0; i < list.length - 1; i++) {
                for (int j = 0; j < list.length - 1; j++) {

                    if (list[j].getYear() > list[j + 1].getYear()) {
                        Person temp = list[j];
                        list[j] = list[j + 1];
                        list[j + 1] = temp;

                        undone = true;
                    }
                }
            }
        } while (undone);
    }

    public static void printArray(Person[] myPerson) {
        int n = myPerson.length;
    
        for (int i = 0; i < n; ++i)
            System.out.println(myPerson[i].getName() + " ");
    }

    public static void main(String[] args) {
        Person[] myPerson = new Person[] { new Person("Susanne Hansen", 1999), new Person("Hans Jespersen", 1896),
            new Person("Eva Gylden", 2789), new Person("Anders Aage", 1786), new Person("Ane Pulsar", 1345) };


        bubbleSort(myPerson);
    
        printArray(myPerson);
    }
}

你的代码有几个错误:

  1. 您需要将要替换的值存储在冒泡排序函数的临时变量中。

您的密码是:

 if (list[j].getYear() > list[j + 1].getYear()) {
                        list[j] = list[j + 1];
                        list[j + 1] = list[j];

                        undone = true;
                    }

需要更新为:

 if (list[j].getYear() > list[j + 1].getYear()) {
                        Person temp = list[j];
                        list[j] = list[j + 1];
                        list[j + 1] = temp;

                        undone = true;
                    }

您的代码中发生的事情是因为您没有将值存储在临时变量中,list[j] 中的对象丢失了。

  1. 切勿在 POJO/Data class 中使用 static。 仅供参考 POJO 是一个 class,它只包含数据和操作数据的函数。

使用 static 将使 java 在内存中只创建一次对象,并且它们将存在于程序的整个生命周期中。

  1. 在 POJO class 中使用 Class 名称。

因为您使用了 Person.namePerson.year 会产生问题,请始终使用此 this.name/this.year 关键字来引用同一 class.

  1. 不要在 Data/Pojo class 中编写只需要调用一次或两次的函数。这将减少内存使用和 运行 时间。

您需要查看 Static Keyword,this Keyword and POJO Classes 的详细信息。