You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java实现Person类按年份冒泡排序输出重复名称问题求助

问题分析与修复方案

核心错误1:滥用static修饰符导致所有Person实例共享属性

  • 你给name、year属性以及对应的get/set方法都加了static关键字,static修饰的属性属于类本身,所有实例共享同一份值,每次new Person时都会覆盖之前的属性值,最终所有Person对象的name和year都是你最后创建的"Ane Pulsar"、1345,自然打印出来全是同一个名字。
  • 修复方式:去掉所有属性、get/set方法的static修饰,属性改为实例级,构造器中给当前对象的属性赋值,不要用Person.前缀。

核心错误2:冒泡排序交换逻辑错误,缺少临时变量

  • 你现在的交换代码是:
list[j] = list[j + 1];
list[j + 1] = list[j];

这两行执行完后,list[j]和list[j+1]都会等于原来的list[j+1],完全没实现交换效果,等于没排序。

  • 修复方式:新增临时变量存储原来的list[j]值,再完成交换。另外你的冒泡排序双层循环逻辑有冗余,外层循环实际不需要额外加,do-while已经可以控制排序结束条件,内层循环可以优化为每次少遍历最后已经排好序的元素。

修正后完整代码

Person类代码

public class Person {
    // 去掉static,改为实例属性
    private String name;
    private int year;

    public Person(String name, int year) {
        super();
        // 给当前实例的属性赋值,不用Person.
        this.name = name;
        this.year = year;
    }

    // 去掉static,改为实例方法
    public String getName() {
        return name;
    }

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

    public int getYear() {
        return year;
    }

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

    // 排序方法是工具方法可以保留static
    public static void bubbleSort(Person[] list) {
        boolean undone;
        do {
            undone = false;
            // 去掉多余的外层for循环
            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);
    }

    // 打印方法可以保留static
    public static void printArray(Person[] myPerson) {
        int n = myPerson.length;
        for (int i = 0; i < n; ++i)
            System.out.println(myPerson[i].getName() + " ");
    }
}

MainPerson类代码

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);
    }
}

运行输出(按year升序排列)
Ane Pulsar 
Anders Aage 
Hans Jespersen 
Susanne Hansen 
Eva Gylden 

内容的提问来源于stack exchange,提问作者guvint

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 22:00:01