仅用数组实现两整型数组投影功能,解决索引越界与结果错误问题
问题根因分析
你现有代码的问题完全来自逻辑方向错误和索引使用不当,具体如下:
- 计数逻辑完全错误:你用双层循环每次匹配到相同元素就计数+1,会重复统计。比如
arr1=[1,1],arr2=[1],你算出来的计数是2,但实际投影结果仅包含1个元素。同时你使用arr1的遍历索引i作为结果数组的下标,当计数结果小于arr1长度时,i就会超过结果数组的最大下标,直接触发ArrayIndexOutOfBoundsException。 - 遍历主体颠倒:需求要求投影时保留第二个数组的原有顺序,你应该遍历第二个入参数组,逐个判断元素是否在第一个入参数组中存在,符合条件才加入结果。你现有逻辑是遍历第一个数组匹配第二个,输出顺序完全不对,未赋值的结果数组位置会保留int默认值0,就会出现你遇到的末尾多0的情况。
正确实现
完全使用基础数组实现,没有引入任何工具类,代码如下:
public int[] project(int[] arr1, int[] arr2) { // 第一步:统计arr2中存在于arr1的元素总数,确定结果数组长度 int resultLen = 0; for (int targetNum : arr2) { if (isExist(arr1, targetNum)) { resultLen++; } } // 第二步:遍历arr2按顺序收集符合条件的元素 int[] result = new int[resultLen]; int writeIndex = 0; for (int targetNum : arr2) { if (isExist(arr1, targetNum)) { result[writeIndex] = targetNum; writeIndex++; } } return result; } // 辅助方法:判断目标值是否存在于指定数组中 private boolean isExist(int[] arr, int target) { for (int num : arr) { if (num == target) { return true; } } return false; }
如果你不想单独封装辅助方法,可以把isExist的逻辑直接嵌套到循环中,运行效果完全一致。
效果验证
- 输入
arr1 = [1, 3, 5, 3],arr2 = [2, 1, 6, 3, 1, 4, 5, 3],输出结果为[1, 3, 1, 5, 3] - 输入
arr1 = [2, 1, 6, 3, 1, 4, 5, 3],arr2 = [1, 3, 5, 3],输出结果为[1, 3, 5, 3]
完全符合需求要求。
内容的提问来源于stack exchange,提问作者annas1019
相关产品推荐
相关产品推荐

