首页 > 解决方案 > 我的冒泡排序方法没有排序。它一遍又一遍地写同一个名字。它应该按年份对 Person(String name, int year) 进行排序

问题描述

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

在这个任务中必须创建一个类,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);
    }
}

标签: javaobjectbubble-sort

解决方案


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

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. 永远不要static在 POJO/Data 类中使用。仅供参考 POJO 是一个仅包含数据和操作数据的函数的类。

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

  1. 使用 POJO 类中的类名。

正如您使用过的那样Person.name,否则Person.year会产生问题,请始终使用此this.name/this.year关键字来引用同一类中的对象。

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

您需要查看Static Keywordthis KeywordPOJO 类的详细信息。


推荐阅读