Java如何让Scanner扫描数组所有元素,解决仅比对首个元素的问题
问题原因及修复方案
核心问题原因
- 你在for-each循环的末尾直接加了
break语句,无论第一次和数组首元素的比对结果如何,都会直接跳出循环,因此永远只会匹配第一个姓名Jose,不可能校验到后面的元素。 - 存在性判断逻辑写在循环内部,会导致每比对一个元素就输出一次结果,逻辑完全错误:比如用户输入
Alex,第一次比对Jose不匹配就会输出稀有姓名提示,第二次比对Alex匹配又输出钥匙链提示,会出现重复输出的问题。 - 直接打印数组对象
names,输出的会是数组的内存地址(类似[Ljava.lang.String;@1b6d3586),无法输出数组的元素内容。 - 缺失
Scanner的导包语句,原代码直接运行会编译报错。
修复后完整代码
import java.util.Scanner; public class NameCheck { public static void main(String[] args) { String[] names = {"Jose", "Alex", "Steven", "Sky", "Ana"}; Scanner scan = new Scanner(System.in); System.out.println("What is your name? "); String input = scan.next(); // 标记变量记录姓名是否存在 boolean isExist = false; // 第一轮循环:判断姓名是否存在 for (String n : names) { if (n.equalsIgnoreCase(input)) { isExist = true; break; // 匹配到后提前跳出循环,减少无效遍历 } } // 循环外输出匹配结果 if (isExist) { System.out.println("Hooray! Your odds of finding a keychain with your name on it are high! =)"); } else { System.out.println("Welcome to the rare names club!!! =D"); } // 第二轮for-each循环:按要求打印所有姓名,元素间用空格分隔 System.out.print("姓名库名单:"); for (String n : names) { System.out.print(n + " "); } // 关闭Scanner释放资源 scan.close(); } }
可选优化方案
如果使用JDK8及以上版本,可以用Stream简化存在性判断逻辑,不用手写循环:
import java.util.Arrays; // 替换原存在性判断的for循环即可 boolean isExist = Arrays.stream(names).anyMatch(name -> name.equalsIgnoreCase(input));
内容的提问来源于stack exchange,提问作者Iris Manjarrez
相关产品推荐
相关产品推荐

