13

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];

最初の方法は内部で1次元配列を作成し、2番目の方法は配列の配列を作成する(アクセスが遅い)ことを知っています。

ただし、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での多次元配列と千鳥配列のパフォーマンスに懸念を抱いていたため、いくつかのテストを実装し、8kx8k要素で結果をベンチマークしました。

テストは次のとおりです。

  1. 多次元2D配列
  2. インデックスが後方にある多次元(yが最初)
  3. 整数バインドの代わりにGetLength(x)を使用した多次元
  4. 後方の兆候をずらして
  5. 千鳥
  6. インデックスに乗算を使用した1次元(サイズxサイズ)
  7. インクリメントインデックス付きの1次元

そして結果:

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#に変換していました-これがジャグ配列の実行方法です

    //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#と同じパフォーマンスのトレードオフを持つアレイのアレイです。配列の配列がギザギザにならないことがわかっている場合は、それをクラスでラップして、1次元のバッキング配列で2次元のインデックスを取得できます。

于 2011-03-15T15:21:54.310 に答える