2014-12-09 3 views
0

Я не уверен, что я просто не вижу вопиющего ответа, если бы я все время ошибался в важной части этого языка программирования.Равномерность 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; на самом деле делает?

+0

Где определяется lastVal? Это окончательные валы? – lordoku

+0

Если новый не используется для создания нового экземпляра объекта, использование equals по существу «указывает» на один и тот же объект. В этом случае объектом является массив. т. е. double [] aVal = новый двойной [4]; double [] aVal2 = aVal «указывают» на тот же экземпляр объекта. Изменение значения влияет как на aVal, так и на aVal2, поскольку они в основном ссылаются на один и тот же объект. – lordoku

+0

@lordoku Извиняюсь, я случайно определил его как finalVals в первой строке кода. Я сделал изменение кода, чтобы исправить это, спасибо. – rshaq

ответ

5

Когда вы сделали,

nonZeros = lastVal; 

Вы назначены референцией lastVal на ненулевые (и да, ненулевых стал указателем, который просто указал на lastVal). Это не копия. Вы можете использовать System.arraycopy((Object src, int srcPos, Object dest, int destPos, int length) как

System.arraycopy(lastVal, 0, nonZeros, 0, nonZeros.length); 
+0

Также вы можете сделать nonZeros = lastVal.clone() – manzur

+0

Я думал, что Java всегда использует pass-by-value. Это относится только к массивам, а не к содержимому в массивах? Если эти массивы были фактическими экземплярами класса java.util.Arrays, работал бы nonZeros = lastVal? – rshaq

+2

@rshaw Java всегда * передается по значению. Но значение типа Object (включая массивы) является ссылкой. Это сработало бы, чтобы изменить ссылку 'nonZeros' на ссылку' lastVal'. –