13

在 C# 中有两种方法可以创建多维数组。

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?还是它仍然是一个数组?

4

6 回答 6

10

它仍然是一个数组数组。只是在 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];
}

(正如 Slaks 所说,锯齿状数组在 .NET 中通常比矩形数组更快。但它们在内存方面的效率较低。)

于 2011-03-15T15:20:04.457 回答
9

你错了;锯齿状(嵌套)数组更快。(CLR 已针对它们进行了优化)

Java 不支持真正的多维数组;那是一个锯齿状的数组。
Java 语法自动创建所有内部数组;在 C# 中,这需要一个单独的循环。

于 2011-03-15T15:19:46.243 回答
7

因为人们担心 .NET 中多维数组与交错数组的性能,所以我实施了一些测试并在 8k x 8k 元素上对结果进行了基准测试:

测试是:

  1. 多维二维数组
  2. 多维索引向后(y 优先)
  3. 使用 GetLength(x) 而不是整数绑定的多维
  4. 与后向指标交错
  5. 交错
  6. 一维(大小 x 大小)与索引中的乘法
  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 模拟器上运行了它们,并得到了相似的数字。

测试功能的代码在这里

于 2011-04-01T05:02:42.267 回答
3

在 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];
于 2011-03-15T15:20:14.660 回答
1

我正在将一些 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;
        }
    }
于 2012-12-04T09:34:51.037 回答
0

它是一个数组数组,具有与 C# 中相同的性能折衷。如果您知道您的数组数组不会是锯齿状的,那么您可以将它包装在一个类中,以便在一维支持数组上获得二维索引。

于 2011-03-15T15:21:54.310 回答