我不确定我是否只是一直没有看到这个编程语言的重要部分我是否错了。
简而言之,我的代码包含一系列名为“buckets”的双精度数组。我的代码需要逐个索引地解析这个数组,检查它的值,并在一个名为“finalVals”的新数组中存储最后5个值。存储桶数组将包含大约100个值,其中大多数为零且不需要。 5个连续零的序列将意味着我需要的数据的结束。所以我需要在桶中返回最后5个值,其中值都是非零值。它存储在名为“nonZeros”的数组中。
lastVal = new double[5]; // A global variable already declared but not set
double nonZeros[] = new double[5]; // A local variable
int numberOfZeros = 0;
for (int i = 0; i < buckets.length; i++) {
double val = buckets[i];
if (val == 0) {
System.out.println("Encountered a zero.");
numberOfZeros++;
lastVal[0] = lastVal[1];
lastVal[1] = lastVal[2];
lastVal[2] = lastVal[3];
lastVal[3] = lastVal[4];
lastVal[4] = val;
}
else if (val != 0) {
System.out.println("Did not encounter a zero.");
numberOfZeros = 0;
lastVal[0] = lastVal[1];
lastVal[1] = lastVal[2];
lastVal[2] = lastVal[3];
lastVal[3] = lastVal[4];
lastVal[4] = val;
nonZeros = lastVal; // This is where the problem was
}
prettyPrintArrays(lastVal,nonZeros);
if (numberOfZeros == 5) { break; }
}
return nonZeros;
问题出在最后一组。 if条件确实正确地检测val是否为0(或实际为0.0)。并保持lastVal中的最后5个值有效。但是,当执行该非工作行时,代码的行为就好像nonZeros成为一个简单指向lastVal的指针。即使在val中遇到零,nonZeros数组总是从那里存储与lastVal相同的值。我的理解是这些变量是独立的。因此,当我们遇到非零时,我期待nonZeros只保留与lastVal相同的值。在遇到5个连续的零之前,函数总是只返回桶的最后5个值。
解决方案是使用代码来替换那个有问题的行,该代码单独设置nonZeros的内容,就像我为lastVal所做的那样。所以我在这里的代码中遗漏了一些明显的东西,总是将lastZeros设置为lastVal?或者我误解了nonZeros = lastVal;实际上呢?
答案 0 :(得分:5)
当你这样做时,
nonZeros = lastVal;
您将lastVal的引用分配给nonZeros(是的, nonZeros成为一个简单指向lastVal的指针)。那不是副本。您可以使用System.arraycopy((Object src, int srcPos, Object dest, int destPos, int length)
之类的
System.arraycopy(lastVal, 0, nonZeros, 0, nonZeros.length);