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
相关产品推荐
相关产品推荐

