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

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: 
                """;
    }
}

额外优化细节

  1. 用trim()处理所有用户输入,避免因误输入空格导致的选项判定错误。
  2. 用printf格式化输出语句,让字符串拼接更简洁易读。
  3. do-while循环确保菜单至少显示一次,符合交互式程序的逻辑习惯。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 19:08:22