Длина собственного массива Java - PullRequest
3 голосов
/ 25 февраля 2009

У меня есть двумерный массив парных чисел в Java, который в основном представляет собой таблицу значений, и я хочу узнать, сколько у него строк ...

Он объявлен в другом месте (и выделен) следующим образом:

double[][] table;

затем передается функции ...

private void doSomething(double[][] table)
{

}

В моей функции я хочу знать длину каждого измерения, не передавая их в качестве аргументов. Я могу сделать это для количества столбцов, но не знаю, как это сделать для строк ...

int cols = table[0].length;
int rows = ?;

Как мне это сделать?

Могу я просто сказать ...

int rows = table.length;

Почему бы не дать строки x cols?

Ответы [ 6 ]

18 голосов
/ 25 февраля 2009

В Java 2D-массив - это не что иное, как массив массивов.

Это означает, что вы можете легко получить количество строк, например:

int rows = array.length;

Это также означает, что каждая строка в таком массиве может иметь разное количество элементов (то есть каждая строка может иметь различное количество столбцов).

int columnsInFirstRow = array[0].length;

Это даст вам только количество столбцов в первой строке, но во второй строке может быть больше или меньше столбцов, чем это.

Вы можете указать, что ваш метод принимает только прямоугольные массивы, а предполагает , что каждая строка имеет такое же количество столбцов, что и первая. Но в этом случае я бы обернул 2D-массив в некоторый класс Matrix (который вам, возможно, придется написать).

Этот тип массива называется Jagged Array .

2 голосов
/ 25 февраля 2009

Посмотрите на этот пример . Они используют .length там, чтобы получить количество строк, [] .length, чтобы получить количество столбцов.

Это потому, что массив состоит из указателей «строк», и они могут вести куда угодно, поэтому вы должны использовать .length для каждого столбца, чтобы получить размеры этих массивов.

1 голос
/ 25 февраля 2009

Ну, во-первых, почему бы вам просто не проверить, если

int rows = table.length;

дает желаемый результат?

Это действительно дает вам количество элементов в первом измерении. Многомерные массивы на самом деле не являются чем-то особенным, поскольку они являются просто массивами массивов массивов ... В вашем случае - двумерный массив - он организован так (в псевдокоде):

double[][] foo = { double[] = {...}, double[] = {...}, ... }

Таким образом, при доступе к foo он ссылается на «внешний» массив, который, конечно, имеет свойство length, которое содержит количество массивов, которые он содержит на втором уровне.

Вы можете прочитать double [] [] как «Массив ([]) двойных массивов (double [])».

1 голос
/ 25 февраля 2009

Я не совсем понимаю ваш вопрос. Вы должны понимать, что в Java многомерные массивы фактически являются массивами массивов.

table.length фактически даст вам количество одномерных массивов, содержащихся в вашем двумерном массиве (при условии, что нет нулевых записей).

table[0].length даст вам размер первой одномерной записи. Это может отличаться от размера других, и может вызвать исключение NullPointerException (хотя ни одно из них невозможно, если оно выделено как new double[rows][cols]).

0 голосов
/ 25 февраля 2009

В качестве альтернативы, вы можете заключить 2d-массив в какой-нибудь класс Matrix или Grid. Внутри вы можете представить его как массив 1d и вычислить смещения для координат строки / столбца.

0 голосов
/ 25 февраля 2009

Нет, не будет. Вы можете просто использовать table.length

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