Java如何实现自定义end命令终止ArrayList输入后随机选取元素
自定义退出指令的ArrayList录入实现方案
原有代码问题
- 你写的
sc.Next()是不存在的方法,Scanner类没有该API - 原循环逻辑没有做退出指令判断,无法在输入指定关键词时终止
- 缺少空集合校验,用户直接输入退出指令时会触发数组越界错误
- 若混用
next()和nextLine()会出现缓冲区残留换行符,导致读取空行的问题
修正后可运行代码
import java.util.ArrayList; import java.util.Random; import java.util.Scanner; public class DinnerRandomPicker { public static void main(String[] args) { Scanner sc = new Scanner(System.in); ArrayList<String> dinnerList = new ArrayList<>(); int inputIndex = 1; // 自定义退出命令,修改该常量值即可更换触发退出的关键词 final String EXIT_KEYWORD = "end"; // 无限循环接收输入,匹配到退出指令时手动break while (true) { System.out.println("Respond end when done. Please enter dinner option #" + inputIndex); String userInput = sc.nextLine().trim(); // 匹配退出指令,终止录入循环 if (EXIT_KEYWORD.equalsIgnoreCase(userInput)) { break; } // 过滤空输入,避免用户误敲回车存入空字符串 if (!userInput.isBlank()) { dinnerList.add(userInput); inputIndex++; } } // 校验集合非空,避免空集合调用随机方法报错 if (dinnerList.isEmpty()) { System.out.println("未录入任何晚餐选项,无法执行随机选择"); sc.close(); return; } // 随机选取逻辑 Random random = new Random(); int randomPos = random.nextInt(dinnerList.size()); String result = dinnerList.get(randomPos); System.out.println("Random Element = " + result); sc.close(); } }
关键逻辑说明
- 采用
while(true)构造无限录入循环,不需要依赖Scanner的hasNext()判断,逻辑更可控 - 整行读取用户输入后第一时间做退出指令匹配,匹配成功直接跳出循环进入后续选餐逻辑,匹配失败才将内容存入列表
- 字符串内容比较使用
equals()/equalsIgnoreCase()方法,禁止用==判断字符串内容相等,后者仅比较对象内存地址,会出现判断失效问题 - 加入
trim()/isBlank()判断是为了兼容用户误输入前后空格、误敲回车的场景,不需要可以直接删除 - 随机选餐前增加空集合校验,避免用户未录入任何内容直接触发退出时,
nextInt(0)抛出参数非法异常
运行效果完全匹配给出的示例,输入end时会立刻终止录入,输出列表中随机选中的晚餐选项。
内容的提问来源于stack exchange,提问作者Adam
相关产品推荐
相关产品推荐

