Java初学者在这里得到非零数字

时间:2019-01-01 03:11:26

标签: java

我只想问一下,即使源中有非零元素时我显式地分配了temp的每个元素,我的方法NonZeros中的temp为什么不更改其元素。这是我的工作。

package nonzeros;
public class NonZeros {
    public static void main(String[] args) {
        int [] B = {0,1,2,3,2};
        int [] newone = NonZeros(B);
        for(int q = 0; q < newone.length; q++){
            System.out.println(newone[q]);
        }
    }
    public static int[] NonZeros(int [] A){
        int [] temp = new int[4];
        for(int i = 0; i < A.length;i++){
            if(A[i] != 0){
                int j = 0;
                temp[j] = A[i];
                j++;
            }
        }
        return temp;
    }
}

结果如下: 跑: 2 0 0 0

但是,结果应该是:1 2 3 2

4 个答案:

答案 0 :(得分:1)

您在循环中声明int j=0; ,因此所有分配都移到同一位置。

答案 1 :(得分:1)

您需要将--lset-extra-dicts dict1:dict2 索引移出循环:

j

当前输出恰好是public static int[] NonZeros(int [] A){ int [] temp = new int[4]; int j = 0; for (int i=0; i < A.length; i++) { if (A[i] != 0) { temp[j] = A[i]; j++; } } return temp; } 的原因是输入数组中的最后一个元素为2,并被写入输出数组中的第一个条目。实际上,当前所有值都被写入输出数组的第一项。

答案 2 :(得分:1)

第一步,计算非零值。第二步,创建新数组。第三步,用非零值填充,例如

[2, 0, 0, 0]

或者,使用lambda和类似的过滤器

public static int[] NonZeros(int[] A) {
    int count = 0;
    for (int i = 0; i < A.length; i++) {
        if (A[i] != 0) {
            count++;
        }
    }
    int[] temp = new int[count];
    int p = 0;
    for (int i = 0; i < A.length; i++) {
        if (A[i] != 0) {
            temp[p++] = A[i];
        }
    }
    return temp;
}

答案 3 :(得分:1)

您要定义的“ j”变量的范围是包含它的if块,因为您在条件内声明了它,从而导致您每次发现非零值时都覆盖temp数组中的第一个元素源中的编号,而其余临时元素保持不变。 解决方案是将“ j”的声明移到循环之前的方法主体中,即:

public static int[] NonZeros(int [] A){
int [] temp = new int[4];
int j = 0;
for(int i = 0; i < A.length;i++){
    if(A[i] != 0){
        temp[j] = A[i];
        j++;
    }
}
return temp;
}