Я не уверен, что я просто не вижу вопиющего ответа, если бы я все время ошибался в важной части этого языка программирования.Равномерность Java Array vs Array Content Equality
Короче говоря, у меня есть код, содержащий массив двойников, называемый «ведрами». Мой код должен анализировать этот индекс по индексу, проверять его значение и сохранять в новом массиве с именем finalVals последние 5 значений. Массив buckets будет содержать около 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). И сохранение последних 5 значений в lastVal. Однако, когда эта нерабочая строка выполняется, код ведет себя так, как если бы nonZeros стал указателем, который просто указывал на lastVal. Массив nonZeros ALWAYS сохранял те же значения, что и lastVal, даже когда в val встречались нули. Насколько я понимаю, эти переменные независимы. Поэтому я ожидал, что nonZeros сохранит те же значения, что и lastVal, в тех случаях, когда мы столкнулись с ненулевым. И функция всегда будет просто возвращать последние 5 значений ведер до того, как будут встречены 5 последовательных нулей.
Решение должно было заменить эту проблемную строку кодом, который устанавливает содержимое nonZeros отдельно, как и для lastVal. Так что я пропустил что-то очевидное в моем коде здесь, который всегда устанавливает nonZeros в lastVal? Или я не понимаю, что nonZeros = lastVal; на самом деле делает?
Где определяется lastVal? Это окончательные валы? – lordoku
Если новый не используется для создания нового экземпляра объекта, использование equals по существу «указывает» на один и тот же объект. В этом случае объектом является массив. т. е. double [] aVal = новый двойной [4]; double [] aVal2 = aVal «указывают» на тот же экземпляр объекта. Изменение значения влияет как на aVal, так и на aVal2, поскольку они в основном ссылаются на один и тот же объект. – lordoku
@lordoku Извиняюсь, я случайно определил его как finalVals в первой строке кода. Я сделал изменение кода, чтобы исправить это, спасибо. – rshaq