Java对象数组按number排序时name字段未同步排序问题排查
问题根因
你的排序逻辑存在核心错误:排序过程中仅交换了不同对象的number字段值,没有同步处理name字段,更没有交换数组中存储的对象本身。
数组里每个位置存的是StudentList对象的引用,每个对象自身同时绑定number和name两个属性。你现在的操作相当于把A对象的编号改成B的、B对象的编号改成A的,但两个对象本身还在原来的数组位置,绑定的姓名也没动,自然会出现编号有序、姓名乱序的错位问题。
修复方案
对象数组排序时,不要单独交换对象的单个属性,直接交换数组两个位置存储的整个对象引用即可,这样每个对象自带的number和name会始终绑定,排序后两个字段自然同步匹配。
修正后的完整可运行代码如下:
class StudentList { //DaftarSiswa public int number; public String name; public StudentList(int number, String name) { this.number = number; this.name = name; } } class OrderNumber { //NomorUrut public static void main(String[] args) { StudentList[] data = new StudentList[10]; data[0] = new StudentList(10, "Brycen"); data[1] = new StudentList( 6, "Devan"); data[2] = new StudentList( 3, "Rylan"); data[3] = new StudentList( 1, "Gordy"); data[4] = new StudentList( 2, "Tim"); data[5] = new StudentList( 4, "Curtis"); data[6] = new StudentList( 5, "Abe"); data[7] = new StudentList( 9, "Melvin"); data[8] = new StudentList( 8, "Ansel"); data[9] = new StudentList( 7, "Dalton"); // 修正排序逻辑:交换整个对象而非单个number字段 for (int i = 0; i < data.length; i++) { for (int j = i + 1; j < data.length; j++) { if (data[i].number > data[j].number) { // 临时变量存储整个StudentList对象 StudentList tmp = data[i]; data[i] = data[j]; data[j] = tmp; } } } // 打印排序结果 System.out.println("Number\t\tName"); for (StudentList item : data) { System.out.println(item.number + "\t\t" + item.name); } } }
运行结果
执行代码后输出和预期完全一致:
Number Name 1 Gordy 2 Tim 3 Rylan 4 Curtis 5 Abe 6 Devan 7 Dalton 8 Ansel 9 Melvin 10 Brycen
注:如果后续需要扩展排序规则(比如按姓名字典序排序),只需要修改if里的判断条件即可,不需要调整交换逻辑。
内容的提问来源于stack exchange,提问作者user19441115
相关产品推荐
相关产品推荐

