Java人员管理系统删除数据后剩余条目ID未自动连续重排问题
Java控制台人员信息管理系统删除功能ID断号修复
问题表现
- 删除末尾人员条目时,剩余ID为1、2这类连续值,显示正常
- 删除中间位置人员条目时,剩余ID会出现断号,比如原有3条数据删除ID=2的条目,剩下ID显示为1、3,不符合连续编号的预期
问题原因
当前代码把人员ID作为固定字符串存储在列表中,删除操作仅移除了目标条目的4个关联元素(ID、名、姓、年龄),没有更新后续条目的存储ID值;同时全局personID变量靠自增、自减维护计数,删除中间条目时计数和实际剩余条目数不匹配,后续新增条目时也会出现ID跳号问题。
修复后完整代码
import java.util.Scanner; import java.util.ArrayList; public class Main{ public static void main(String[] args) { Scanner scanner = new Scanner(System.in); ArrayList<String> name = new ArrayList<String>(); boolean initiated = false; int operation = 0; //用户操作选项 int target = 0; //目标条目索引 while(operation != 0|| initiated == false){ System.out.println("============================"); System.out.print("1-新增人员\n2-编辑人员\n3-删除人员\n4-输出报表\n请选择操作: "); operation = scanner.nextInt(); System.out.println("============================"); if(operation == 1){ // 直接按当前实际人数计算新ID,废弃全局变量计数,避免计数不准 int personID = name.size()/4 + 1; Add(scanner, personID, name); } else if(operation == 2){ Edit(scanner,target,name); } else if(operation == 3){ System.out.println("删除人员档案"); Delete(scanner, target, name); } else if(operation == 4){ System.out.println("输出人员记录.."); Report(name); }else{ System.out.print("输入错误!"); return; } if(operation != 4){ Report(name); } initiated = true; } } public static void Add(Scanner scanner, int personID, ArrayList<String> name){ System.out.println("新增人员档案"); name.add(Integer.toString(personID)); String dummyScaner = scanner.nextLine(); // 吸收换行符,保证nextLine能正常读取输入 System.out.print("输入名字: "); String input0 = scanner.nextLine(); name.add(input0); System.out.print("输入姓氏: "); String input1 = scanner.nextLine(); name.add(input1); System.out.print("输入年龄: "); String input2 = scanner.nextLine(); name.add(input2); } public static void Edit(Scanner scanner, int target, ArrayList<String> name){ System.out.println("编辑人员档案"); Report(name); System.out.print("输入要更新的人员编号: "); int targetID = scanner.nextInt(); target = (targetID-1)*4; System.out.print("输入名字: "); String dummyInput = scanner.nextLine(); String input0 = scanner.nextLine(); name.set(target+1,input0); System.out.print("输入姓氏: "); String input1 = scanner.nextLine(); name.set(target+2,input1); System.out.print("输入年龄: "); String input2 = scanner.nextLine(); name.set(target+3,input2); System.out.println("编号 "+targetID+" 更新成功!"); } public static void Delete(Scanner scanner, int target, ArrayList<String> name){ System.out.println("删除人员档案"); Report(name); System.out.print("输入要删除的人员编号: "); int targetID = scanner.nextInt(); target = (targetID-1)*4; // 倒序移除元素,避免索引偏移问题 name.remove(target+3); name.remove(target+2); name.remove(target+1); name.remove(target); // 核心修复:删除后重排所有剩余条目的ID,保证连续 for(int i=0; i<name.size()/4; i++){ int idIndex = i*4; name.set(idIndex, Integer.toString(i+1)); } System.out.println("编号 "+targetID+" 删除成功!"); } public static void Report(ArrayList<String> name){ System.out.println("============================\n"); System.out.print("编号 | 名字 | 姓氏 | 年龄"); for (int i = 0; i < name.size(); i++) { if(i%4==0){ System.out.println(""); } System.out.print(name.get(i)+" | "); } System.out.println(""); } }
关键改动说明
- 移除了全局维护的
personID变量,新增人员时直接通过当前列表总长度计算新ID:总人数=列表长度/4,新ID=总人数+1,从根源避免计数和实际数据不一致 - 在
Delete方法移除完目标条目后,新增ID重排逻辑:遍历所有剩余人员,把每个人员存储的ID值更新为从1开始的连续序号 - 修正了编辑、删除成功提示里的编号显示,原来显示的是数组索引值,现在直接显示用户输入的实际编号,符合日常使用习惯
内容的提问来源于stack exchange,提问作者mmmmmmmellie
相关产品推荐
相关产品推荐

