Многомерные массивы в Java и C # - PullRequest
12 голосов
/ 15 марта 2011

В C # есть 2 способа создания многомерных массивов.

int[,] array1 = new int[32,32];

int[][] array2 = new int[32][];
for(int i=0;i<32;i++) array2[i] = new int[32];

Я знаю, что первый метод создает внутри себя одномерный массив, а второй - массив массивов (более медленный доступ).

Однако в Java нет такой вещи, как [,], и я вижу многомерные массивы, объявленные так:

int[][] array3 = new int[32][32];

Поскольку такой синтаксис недопустим в C # и Javaне имеет int[,], мне интересно, если это эквивалентно array1?Или это все еще массив массивов?

Ответы [ 6 ]

8 голосов
/ 15 марта 2011

Это все еще массив массивов. Просто в C # вам придется создавать каждый подмассив в цикле. Итак, это Java:

// Java
int[][] array3 = new int[32][32];

эквивалентно этому C #:

// C#
int[][] array3 = new int[32][];
for (int i = 0; i < array3.Length; i++)
{
    array3[i] = new int[32];
}

(Как говорит Слакс, зубчатые массивы, как правило, быстрее в .NET, чем прямоугольные массивы. Они менее эффективны с точки зрения памяти.)

8 голосов
/ 15 марта 2011

Вы неверны;рваные (вложенные) массивы быстрее.(CLR оптимизирован для них)

Java не поддерживает истинные многомерные массивы;это неровный массив.
Синтаксис Java автоматически создает все внутренние массивы;в C # для этого потребуется отдельный цикл.

7 голосов
/ 01 апреля 2011

Поскольку люди были обеспокоены производительностью многомерных по сравнению со смещенными массивами в .NET, я реализовал несколько тестов и сравнил результаты по 8k на 8k элементов:

Тесты были:

  1. Многомерный двумерный массив
  2. Многомерный с индексами назад (сначала y)
  3. Многомерный с GetLength (x) вместо целочисленной границы
  4. В шахматном порядке с обратными знаками
  5. В шахматном порядке
  6. одномерный (размер х размер) с умножением на индекс
  7. одномерный с индексом приращения

Арезультаты:

one <> Elapsed Time: 0.543558s
two <> Elapsed Time: 0.8911516s
three <> Elapsed Time: 0.8908123s
four <> Elapsed Time: 1.1367238s
five <> Elapsed Time: 0.3039648s
six <> Elapsed Time: 0.8110969s
seven <> Elapsed Time: 0.2629394s

Ради интереса я запустил их также на эмуляторе WP7 и получил похожие цифры.

Код функции теста здесь .

3 голосов
/ 15 марта 2011

В Java вы объявляете массив массивов.

Вы можете увидеть это по следующему коду:

int[][] arrOfArr = new int[5][];
arrOfArr[0] = new int[5];
arrOfArr[1] = new int[1];
arrOfArr[2] = new int[9];
...

int[][] arr = new int[3][3]; это просто сокращение для:

int[][] arr = new int[3][];
arr[0] = new int[3];
arr[1] = new int[3];
arr[2] = new int[3];
1 голос
/ 04 декабря 2012

Я переводил некоторый Java-код на C # - вот как я сделал массив Jagged

    //Java
    private static int grad3[][] = {{1,1,0},{-1,1,0},{1,-1,0},{-1,-1,0},{1,0,1},{-1,0,1},{1,0,-1},{-1,0,-1},{0,1,1},{0,-1,1},{0,1,-1},{0,-1,-1}};

    //C#
    private static int[,] grad3setup = { { 1, 1, 0 }, { -1, 1, 0 }, { 1, -1, 0 }, { -1, -1, 0 }, { 1, 0, 1 }, { -1, 0, 1 }, { 1, 0, -1 }, { -1, 0, -1 }, 
                                  { 0, 1, 1 }, { 0, -1, 1 }, { 0, 1, -1 }, { 0, -1, -1 } };

    private static int[][] grad3
    {
        get
        {
            int[][] grad3 = new int[12][];
            for (int i = 0; i < grad3.Length; i++)
            {
                grad3[i] = new int[3] { grad3setup[i, 0], grad3setup[i, 1], grad3setup[i, 2] };
            }
            return grad3;
        }
    }
0 голосов
/ 15 марта 2011

Это массив массивов с теми же компромиссами производительности, что и в C #. Если вы знаете, что ваш массив массивов не будет зазубренным, то вы можете заключить его в класс, чтобы выполнить двумерную индексацию для 1-го вспомогательного массива.

...