Java如何用单循环遍历两个等长一维数组 实现新冠风险判定功能
新冠感染风险判定程序代码修复方案
业务背景
我正在程序中开发新冠感染风险判定方法,通过绑定低、中、高三类健康风险等级的问题标记判断用户风险情况:例如用户在“a. 发热”问题输入“y”(是)则对应计入低风险累计值,输入“n”则直接跳转至下一题,全部问题作答完成后,根据低、中、高风险的累计计数判定用户最终风险等级。
现有代码核心问题
- 错误使用双层循环:两个长度相同的对应数组仅需单层循环共用索引即可,双层循环会导致每个问题重复询问10次,完全不符合预期交互逻辑
- 基本类型值传递问题:
low/medium/high是int基本类型,初始化no1SubQuestHealthRisk时仅将三个变量的初始值0复制到数组中,后续修改数组元素不会同步更新三个计数变量,最终风险等级判定逻辑无法拿到正确统计值 - 存在冗余空元素:两个数组下标0的元素均为无用空值,可直接删除优化
- 多余输入读取逻辑:循环内多写了一次
input.nextLine(),会导致用户输入被异常吞掉
修正后代码
System.out.println("1. 最近14天内您是否出现过以下症状?"); int low = 0, medium = 0, high = 0; Scanner input = new Scanner(System.in); String result = ""; // 优化数组结构,删除无用的下标0空元素 String[] no1SubQuestion = { "a. 发热", "b. 咳嗽/感冒", "c. 身体疼痛", "d. 咽喉痛", "e. 乏力/疲惫", "f. 头痛", "g. 腹泻", "h. 味觉嗅觉丧失", "i. 呼吸困难" }; // 用1/2/3分别标记对应问题所属的风险等级:1=低风险,2=中风险,3=高风险 int[] no1SubQuestHealthRisk = {1,2,3,3,3,3,3,3,3}; // 单层循环共用索引,每次取对应位置的问题和风险等级标记 for (int i = 0; i < no1SubQuestion.length; i++) { try { System.out.println(no1SubQuestion[i]); System.out.printf("(是请输入Y,否请输入N)\n>> "); String answer = input.nextLine().trim(); if (!answer.equalsIgnoreCase("y") && !answer.equalsIgnoreCase("n")) { throw new InputMismatchException("invalid input"); } // 用户选是就给对应风险等级的计数+1 if (answer.equalsIgnoreCase("y")) { int riskType = no1SubQuestHealthRisk[i]; if(riskType == 1) low++; else if(riskType == 2) medium++; else if(riskType == 3) high++; } } catch (InputMismatchException e) { System.out.println("输入错误!请仅输入Y(是)或N(否)"); // 输入错误时回退索引,重新询问当前题目 i--; } } // 风险等级判定逻辑 if (high > 0) { result = "高风险"; } else if (medium > 0 && high == 0) { result = "中风险"; } else if ((low == 1 || low == 2) && (medium == 0 && high == 0)) { result = "低风险"; } else { result = "无风险"; } return result;
内容的提问来源于stack exchange,提问作者Hi I'm Justin
相关产品推荐
相关产品推荐

