Java如何匹配原数组与乱序数组 关联感染者ID及其接触者
实现方案
核心逻辑
公民ID是从0开始递增的连续序列,和数组下标天然一一对应。只要把每个公民随机生成的接触者ID存入同长度的数组,查询ID为n的公民接触者时,直接取数组下标为n的元素即可,不需要额外做遍历匹配。
修改点
- 新增长度与公民总数一致的接触者数组,生成随机接触者时同步存入数组对应下标位置,不要只打印不存储
- 删除原代码中重复的公民总数输入逻辑,改为接收用户输入的感染者ID
- 增加ID合法性校验:输入ID小于0或大于等于公民总数时,提示输入非法
- 校验通过后直接通过数组下标取出对应接触者ID输出即可
可运行完整代码
import java.util.Scanner; public class ContagionControl { public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.println("Please Enter the Number of Citizens: "); int citizenCount = input.nextInt(); // 下标对应当前公民ID,存储值为该公民的接触者ID int[] contacteeArr = new int[citizenCount]; // 打印公民ID表头 System.out.printf("%8s", "Id"); for (int i = 0; i < citizenCount; i++) { System.out.printf("%4d", i); } System.out.println(); // 生成随机接触者、存入数组并打印 System.out.printf("%8s", "Cantactee"); for (int i = 0; i < citizenCount; i++) { int contacteeId = (int) (Math.random() * citizenCount); contacteeArr[i] = contacteeId; System.out.printf("%4d", contacteeId); } System.out.println(); // 接收感染者ID System.out.println("Please Enter the Infected Citizen ID:"); int infectedId = input.nextInt(); // 校验ID范围 if (infectedId < 0 || infectedId >= citizenCount) { System.out.println("Error: Invalid citizen ID"); input.close(); return; } // 匹配并输出结果 System.out.printf("Contactee of infected citizen %d: %d", infectedId, contacteeArr[infectedId]); input.close(); } }
扩展说明
如果后续需求调整为一个公民对应多个接触者,只需将接触者数组的元素类型改为ArrayList<Integer>存储多个接触者ID即可,核心的下标匹配逻辑不需要改动。
内容的提问来源于stack exchange,提问作者thisisbenynag
相关产品推荐
相关产品推荐

