You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中newArray首元素为0的原因及代码修正求助

问题分析与修正方案

核心错误点

  1. 数组长度计算错误:

    • 初始newArraysize设为1,导致最终数组长度多1(例子中实际匹配2个元素,却生成了长度为3的数组)。
    • 未处理重复匹配的情况:如果arr1中有重复的匹配元素,会重复增加计数,进一步导致长度错误。
  2. 数组填充逻辑错误:

    • 填充newArray时直接使用arr1的循环索引i,当arr1中元素不在arr2中时,对应的newArray位置会保留int数组的默认值0(比如arr1[0]是6,不在arr2里,newArray[0]就为0)。
    • 索引对应关系完全错误,应该用独立的计数器跟踪newArray的插入位置,而不是复用arr1的索引。
  3. 未实现去重:原代码没有处理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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 02:05:26