Инициализация нескольких массивов Android Java

При объявлении и назначении примитивов перед циклом все работает нормально и позже может отличаться друг от друга

//example
double sum1, sum2, sum3, sum4;
sum1 = sum2 = sum3 = sum4 = 0;
//later each gets own value correctly

Можно ли сделать oneliner для массива?

//example
double[][] compare, updated; // works as intended
compare = updated = new double[SIZE][]; // makes compare=updated

Проблема со второй строкой заключается в том, что она игнорирует все последующие вычисления для updated и берет значения из compare.


person JayJayAbrams    schedule 28.07.2018    source источник
comment
Вы можете сделать это с помощью примитивов, но не Object. Object использовать ссылку и массив в java - это Object.   -  person zhh    schedule 28.07.2018


Ответы (2)


Если под «однострочником» вы подразумеваете один оператор и пишете new double[] один раз, да, вы можете сделать это:

    double[] arr1, arr2;
    arr1 = (arr2 = new double[10]).clone(); // this is the line
    arr1[0] = 10;
    System.out.println(arr2[0]); // 0.0

Но это не очень читабельно. Это становится еще хуже, когда вы делаете это с большим количеством массивов:

arr1 = (arr2 = (arr3 = new double[10]).clone()).clone();

Я предлагаю вам по-прежнему использовать несколько строк для этого.

person Sweeper    schedule 28.07.2018
comment
Да, в основном я имел в виду однострочное утверждение. Итак, другого удобного способа инициализации нескольких массивов одинакового размера не существует, верно? - person JayJayAbrams; 28.07.2018
comment
@JayJayAbrams Я не думаю, что есть. - person Sweeper; 28.07.2018

В качестве альтернативы ответу @Sweeper рассмотрите возможность использования метода Arrays.copyOf(), как это предлагается в этом ответе. Обратите внимание, что copyOf() является типобезопасным, а метод clone() — нет.

double[] a, b, c;
c = Arrays.copyOf((b = Arrays.copyOf((a = new double[10]), a.length)), b.length);

Но опять же, я повторю, как это делает @Sweeper, что этот код действительно пахнет, и вам следует подумать о том, чтобы сделать его в несколько строк. Как говорит Стив МакКоннелл в Code Complete 2nd Ed. , основным техническим императивом программного обеспечения является управление сложностью (т.е. сделать ваш код простым). Это не обязательно означает сокращение количества строк кода, но больше связано с тем, чтобы люди, читающие ваш код, могли с первого взгляда понять, что он делает.

person entpnerd    schedule 28.07.2018
comment
Я не использовал Arrays.copyOf, потому что пытался максимально воссоздать ощущение a = b = c, сделав переменные массива ближе. Но в любом случае хороший ответ, +1. - person Sweeper; 28.07.2018