Java数组存储数字查询存在性时false返回逻辑异常问题求助
问题根因
- 核心问题出在
searchNumbers方法的循环逻辑和输出时机错误:你当前用外层遍历已存储数组、内层遍历待搜索数组的结构,每完成一次单元素对比就直接输出结果,会导致同一个待搜索数字被重复判断N次(N等于已存储数组的长度),最终输出的结果总条数为「已存储数组长度 * 待搜索数组长度」,完全不符合你需要的「每个待搜索数字仅输出一次结果」的需求 - 缺少存在状态标记:你没有给每个待搜索数字设置统一的存在标记,无法在遍历完所有已存储元素后再给出最终的判断结果
修复代码
直接替换原有的searchNumbers方法即可:
static void searchNumbers(int[] numbersIn, int... searchIn) { // 外层优先遍历每个待搜索的数字,保证每个数字仅输出一次结果 for (int target : searchIn) { boolean isExist = false; // 内层遍历所有已存储的数字,查找匹配项 for (int storedNum : numbersIn) { if (storedNum == target) { isExist = true; break; // 找到匹配项后提前终止循环,减少不必要的遍历 } } // 遍历完所有已存储数字后,统一输出最终结果 System.out.println(isExist + " " + target); } }
可选优化方案
如果已存储数组长度较大,可将已存储数组转成HashSet做查询,将查询时间复杂度从O(m*n)降低到O(m+n),示例代码如下:
import java.util.HashSet; import java.util.Set; // 类内的searchNumbers方法 static void searchNumbers(int[] numbersIn, int... searchIn) { Set<Integer> storedNumSet = new HashSet<>(); for (int num : numbersIn) { storedNumSet.add(num); } for (int target : searchIn) { System.out.println(storedNumSet.contains(target) + " " + target); } }
另外补充小优化点:main方法中不需要创建多个Scanner实例,全程共用同一个Scanner对象即可,避免不必要的资源开销。
内容的提问来源于stack exchange,提问作者gabriel faria Costa
相关产品推荐
相关产品推荐

