Java中newArray首元素为0的原因及代码修正求助
问题分析与修正方案
核心错误点
数组长度计算错误:
- 初始
newArraysize设为1,导致最终数组长度多1(例子中实际匹配2个元素,却生成了长度为3的数组)。 - 未处理重复匹配的情况:如果arr1中有重复的匹配元素,会重复增加计数,进一步导致长度错误。
- 初始
数组填充逻辑错误:
- 填充
newArray时直接使用arr1的循环索引i,当arr1中元素不在arr2中时,对应的newArray位置会保留int数组的默认值0(比如arr1[0]是6,不在arr2里,newArray[0]就为0)。 - 索引对应关系完全错误,应该用独立的计数器跟踪
newArray的插入位置,而不是复用arr1的索引。
- 填充
未实现去重:原代码没有处理arr1中重复的匹配元素,会导致新数组中出现重复元素。
修正方案1:使用集合实现(简洁高效)
利用HashSet的自动去重特性,无需手动计算长度和处理重复元素,代码更简洁:
package Arrays; import java.util.Arrays; import java.util.HashSet; import java.util.Set; public class InteractionOfTwoArrays { public static void main(String[] args) { int arr1[]= new int[] {6,9,8,5}; int arr2[]= new int[] {9,2,4,1,8}; intersections(arr1,arr2); } public static void intersections(int arr1[], int arr2[]) { // 存储匹配的不重复元素 Set<Integer> matchSet = new HashSet<>(); for (int num : arr1) { for (int target : arr2) { if (num == target) { matchSet.add(num); // 自动去重,重复元素不会被多次添加 break; // 找到匹配就跳出内层循环,减少不必要的遍历 } } } // 将集合转为数组 int[] newArray = new int[matchSet.size()]; int index = 0; for (int num : matchSet) { newArray[index++] = num; } System.out.println(Arrays.toString(newArray)); } }
修正方案2:纯数组实现(不使用集合)
通过boolean数组标记已处理元素,解决计数和填充的问题:
package Arrays; import java.util.Arrays; public class InteractionOfTwoArrays { public static void main(String[] args) { int arr1[]= new int[] {6,9,8,5}; int arr2[]= new int[] {9,2,4,1,8}; intersections(arr1,arr2); } public static void intersections(int arr1[], int arr2[]) { int newArraySize = 0; boolean[] counted = new boolean[arr1.length]; // 标记已计数的元素 // 第一步:计算不重复匹配元素的数量 for (int i = 0; i < arr1.length; i++) { if (counted[i]) continue; // 跳过已计数的元素 for (int j = 0; j < arr2.length; j++) { if (arr1[i] == arr2[j]) { newArraySize++; counted[i] = true; // 标记arr1中所有相同的元素为已计数,避免重复 for (int k = i + 1; k < arr1.length; k++) { if (arr1[k] == arr1[i]) { counted[k] = true; } } break; } } } // 第二步:创建数组并填充 int[] newArray = new int[newArraySize]; int index = 0; boolean[] added = new boolean[arr1.length]; // 标记已添加的元素 for (int i = 0; i < arr1.length; i++) { if (added[i]) continue; // 跳过已添加的元素 for (int j = 0; j < arr2.length; j++) { if (arr1[i] == arr2[j]) { newArray[index++] = arr1[i]; added[i] = true; // 标记arr1中所有相同的元素为已添加 for (int k = i + 1; k < arr1.length; k++) { if (arr1[k] == arr1[i]) { added[k] = true; } } break; } } } System.out.println(Arrays.toString(newArray)); } }
内容的提问来源于stack exchange,提问作者Anish Kuls
相关产品推荐
相关产品推荐

