2016-01-09 3 views
0

Я пытаюсь выполнить полный одномерный массив в двумерном массиве в Java. Я сделал это с помощью этого способа, есть ли другой способ лучше этого? полный одномерный массив в двумерном массиве java

public double[][] getResult(double[] data, int rowSize) { 
    int columnSize = data.length; 
    double[][] result = new double[columnSize][rowSize]; 
    for (int i = 0; i < columnSize; i++) { 
     result[i][0] = data[i]; 
    } 
    return result; 
} 

Edit: я не собираюсь повторно данные -Array я хочу, чтобы установить ссылку первого столбца в результате -array к данных -array .а это возможно? если да, как я могу это сделать?

+0

, который отлично выглядит для меня – SomeDude

+0

Я не понимаю, вы хотите преобразовать массив 1d в массив 2d с определенным размером строки? Что делать, если длина массива не делится на размер строки? Например, у вас есть 1d массив длиной 16. Вы даете размер строки 7. Элементы 0-6 идут в первой строке, 7-13 во второй, 14-15 идут в третьей, и у вас есть 5 "пустых "ячеек. – user1803551

+0

, если код работает, вы должны опубликовать его в нашем члене стека [codereview] (codereview.stackexchange.com/questions) – davejal

ответ

0

Я не знаю, имеет ли это смысл в вашем приложении/контексте, но по соображениям производительности вы обычно должны иметь когерентных данных как можно ближе к памяти.
Для массивов (double[row][column]) это означает, что данные, имеющие то же значение row, обычно хранятся очень близко в памяти. Например, когда у вас есть массив, как double[][] d = double[10][10] и сохраните два значения, например d[0][0] = 1.0; d[1][0] = 2.0;, тогда они (я думаю) 40 байтов вдали друг от друга.
Но когда вы сохраняете их как d[0][0] = 1.0; d[0][1] = 2.0;, они непосредственно рядом друг с другом в памяти и обычно загружаются в супербыстрый кеш в то же время. Если вы хотите использовать их итеративно, то это огромный прирост производительности.

Так что для вашего приложения, первое улучшение было бы это:

public double[][] getResult(double[] data, int rowSize) { 
    int columnSize = data.length; 
    double[][] result = new double[rowSize][columnSize]; 
    for (int i = 0; i < columnSize; i++) { 
     result[0][i] = data[i]; 
    } 
    return result; 
} 

Во-вторых, вы должны рассмотреть вопрос о целесообразности вы собираетесь повторно использовать data -Array или нет. Потому что, если вы не повторно использовать его, вы можете просто установить ссылку первой строки в вашем result массиве к data -Array так:

result[0] = data; 

Опять же, это дает вам еще огромный прирост производительности.
Почему? Ну просто потому, что вам не нужно использовать ненужную много памяти, копируя все значения - и, как вы знаете, распределение памяти может быть довольно медленным.
Так что всегда используйте память вместо того, чтобы ее копировать.

Так мое полное предложение пойти с этим кодом:

public double[][] getResult(double[] data, int rowSize) { 
    double[][] result = new double[rowSize][]; 
    result[0] = data; 
    return result; 
} 

Это не является обязательным ли установить вас на columnSize или нет.

+0

невозможно применить первую точку, это не подходит для моего приложения, вторая точка - это именно то, что я хочу сделать (я не буду повторно использовать data-Array), но Я хочу установить ссылку на первый столбец (не строку) в массиве результатов на массив данных. Возможно ли это? если да, как я могу это сделать? (я собираюсь обновить вопрос) –

+0

Боюсь, что тогда это невозможно. –

Смежные вопросы