Получить один размерный массив из многомерного массива в JAVA - PullRequest
3 голосов
/ 16 августа 2011

Я новичок в Java (день 2), поэтому, пожалуйста, сообщите и простите меня, если это не имеет смысла.

У меня есть двумерный массив, и я хочу определить новый массив, который состоит из всего первого измерения для определенного местоположения во втором измерении (пример ниже). Единственный способ, которым я могу думать, это сделать с помощью цикла for, примерно так:

double[][] twoDimArray = new double[5000][200];
// some code defining twoDimArray

double[] oneDimArray = new double[5000];
for (int i=0; i<5000; ++i) {
    oneDimArray[i] = twoDimArray[i][199];
}

Это прекрасно работает, но есть ли более чистый способ сделать это? Возможно, что-то вроде этого:

double[] oneDimArray = twoDimArray[][199];

Спасибо.

Ответы [ 5 ]

4 голосов
/ 16 августа 2011

В Java нет многомерных массивов как таковых, есть только массивы массивов. Но даже если бы они были, размеры сохраняются либо в мажорной строке, либо в мажорной колонке. В зависимости от этого ячейки в одной и той же «строке» или в одном и том же «столбце» (то есть в первом или втором измерении) находятся в памяти последовательно и могут быть непосредственно назначены одномерному массиву.

Поскольку вы пытаетесь извлечь по измерению, которое хранится последовательно, нет лучшего способа, чем цикл for. Если, с другой стороны, вы хотели бы получить все элементы с первой позиции 199, вы можете просто сделать double[] oneDimArray = twoDimArray[199];.

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

double[][] twoDimArray = new double[200][5000]; // dimensions are swaped here
// some code defining twoDimArray (with swapeddimensions)

double[] oneDimArray = twoDimArray[199];
2 голосов
/ 16 августа 2011

twoDimArray[0] на самом деле является первым измерением вашего массива, если я правильно понимаю ваш вопрос.

Представьте, что 2D-массив представляет собой набор строк из 1-мерных массивов. Таким образом, если у вас twoDimArray[5000][200], то у вас есть 5000 строк (одномерных массивов), каждый из которых имеет 200 точек.

так twoDimArray[2] например, фактически является третьей строкой (массив 1D), то есть double[]

РЕДАКТИРОВАТЬ : Так как в Java есть массивы массивов, а не точно двумерные массивы, вы можете изменить порядок определения массива на массив [200] [5000], чтобы вы могли легко получить доступ к нужному размеру в одной строке.

1 голос
/ 16 августа 2011

Попробуйте это:

Double[] oneDimArray = new ArrayList<Double[]>(Arrays.asList(twoDimArray)).get(199);
1 голос
/ 16 августа 2011

То, что вы делаете, является наиболее эффективным способом. Там нет ярлыков (как некоторые языки могут иметь newarr = oldarr[:][199]; или что-то). Если бы вам пришлось делать это больше, чем пару раз, я бы порекомендовал сделать метод для этого.

double[] acquireRow(double[][] orig, int row) {
    double[] ret = new double[orig.length];
    for(int i = 0; i < ret.length; i++) {
        ret[i] = orig[i][row];
    }
    return ret;
}
0 голосов
/ 16 августа 2011

Я думаю, что вы должны указать оба измерения при создании массива.Если вы не хотите указывать это значение, потому что не уверены в нем, прочитайте тип данных «lists».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...