Java器官捐赠注册表开发:器官匹配无输出问题排查
器官捐赠匹配无输出问题的修复
你的代码运行后无匹配输出,最核心的原因是字符串比较用了==——Java中==用于比较对象的内存地址,而非字符串内容,所以即使器官名称完全相同,也会被判定为不匹配。此外代码还有其他输入处理和逻辑冗余问题,以下是完整修复方案:
关键问题与修复点
- 字符串比较修复:将
==替换为equals()方法(比较字符串内容),如果需要忽略大小写可使用equalsIgnoreCase()。 - Scanner对象优化:仅创建一个Scanner实例,避免重复创建导致的输入异常;统一用
sc.nextLine()处理输入,避免next()与nextLine()混用引发的换行残留问题。 - 匹配逻辑简化:每次添加新捐赠者后,仅用该捐赠者匹配受赠者,无需遍历全部已有捐赠者,减少冗余计算。
- 循环结构简化:用
do-while替代嵌套的while循环,逻辑更清晰,避免退出异常。
修复后的完整代码
import java.util.Scanner; import DSAndAlgos.*; public class OrganDonation { public static void main(String[] args) { ArrayIndexedList<OrganInfo> oDonated = new ArrayIndexedList<OrganInfo>(); ArrayIndexedList<OrganInfo> oNeeded = new ArrayIndexedList<OrganInfo>(); Scanner sc = new Scanner(System.in); String input; do { System.out.println(menuOfOptions()); input = sc.nextLine().trim(); // 去除输入前后空格,避免误判 switch(input) { // 添加受赠者 case "1": System.out.println("For who? "); String recipientName = sc.nextLine().trim(); System.out.println("What organ? "); String neededOrgan = sc.nextLine().trim(); OrganInfo needed = new OrganInfo(neededOrgan, recipientName); oNeeded.add(needed); break; // 添加捐赠者并匹配 case "2": System.out.println("By who?"); String donorName = sc.nextLine().trim(); System.out.println("What organ?"); String donatedOrgan = sc.nextLine().trim(); OrganInfo newDonor = new OrganInfo(donatedOrgan, donorName); oDonated.add(newDonor); // 仅用新添加的捐赠者匹配受赠者,减少冗余 for(int k = 0; k < oNeeded.size(); k++) { OrganInfo recipient = oNeeded.get(k); if(recipient.getOrgan().equals(newDonor.getOrgan())) { System.out.printf("%s's %s was given to %s%n", newDonor.getPerson(), newDonor.getOrgan(), recipient.getPerson()); } } break; // 退出程序 case "3": System.out.println("Goodbye!"); break; // 无效输入处理 default: System.out.println("Invalid selection. Please try again."); break; } } while(!input.equals("3")); sc.close(); } public static class OrganInfo { private String _organ; private String _person; public OrganInfo(String organ, String person) { _organ = organ; _person = person; } public String getOrgan() {return _organ;} public String getPerson() {return _person;} } public static String menuOfOptions() { return """ 1.) Register organ needed. 2.) Register organ donated. 3.) Exit. ---------------------------- Select 1, 2 or 3: """; } }
额外优化细节
- 用
trim()处理所有用户输入,避免因误输入空格导致的选项判定错误。 - 用
printf格式化输出语句,让字符串拼接更简洁易读。 do-while循环确保菜单至少显示一次,符合交互式程序的逻辑习惯。
内容的提问来源于stack exchange,提问作者eggshell
相关产品推荐
相关产品推荐

