web-dev-qa-db-ja.com

サイズの異なる多次元配列

私は何かをテストするアイデアを持っていて、それはうまくいきました:

    String[][] arr = new String[4][4];

    arr[2] = new String[5];

    for(int i = 0; i < arr.length; i++)
    {
        System.out.println(arr[i].length);
    }

出力は明らかに次のとおりです。

4
4
5
4

だから私の質問は:

  • これは良いスタイルか悪いスタイルのコーディングですか?
  • これは何のために良いのでしょうか?
  • そして何よりも、宣言自体にそのような構成を作成する方法はありますか?
  • また...なぜそれができるのですか?
16
Loki
  • これは良いスタイルか悪いスタイルのコーディングですか?

何かのように、それは状況に依存します。 ギザギザの配列(呼ばれる)が実際に適切である状況があります。

  • これは何のために良いのでしょうか?

さて、1つの配列に異なる長さのデータセットを格納します。たとえば、文字列"hello"および"goodbye"、それらの文字配列を1つの構造に格納したい場合があります。これらのchar配列は長さが異なるため、ギザギザの配列を使用します。

  • そして何よりも、宣言自体にそのような構成を作成する方法はありますか?

はい:

char[][] x = {{'h','e','l','l','o'},
              {'g','o','o','d','b','y','e'}};
  • また...なぜそれができるのですか?

Java言語仕様、 §10.6 で許可されているため。

21
arshajii
  1. これはすばらしいコーディングスタイルです。何も問題はありません。私は過去にさまざまな問題のためにギザギザの配列を自分で作成しました。

  2. この方法でデータを格納する必要がある場合があるので、これは良いことです。この方法でデータを保存すると、メモリを節約できます。これは、特定のシナリオでアイテムをより効率的にマップする自然な方法です。

  3. 単一の行で、明示的に配列にデータを入力せずに?いいえ、これは私が考えることができる最も近いものです。

    int[][] test = new int[10][];
    test[0] = new int[100];
    test[1] = new int[500];
    

    これにより、行に異なる長さの配列を挿入できます。私はこのような値を入力するよりもこのアプローチを好みます:

    int[][] test = new int[][]{{1,2,3},{4},{5,6,7}};
    

    大規模な不規則な配列を処理するときに入力する方が読みやすく、実用的だからです。

  4. 2で与えられた理由のためにそれを行うことは可能です。人々は不規則な配列を必要とする正当な理由があるので、言語の作成者はそれを行う方法を私たちに与えました。
12

(1)技術的/機能的/構文的に何も問題はありませんが、オブジェクトの初期化によって提供される仮定(String [4] [4])を破るので、コーディングスタイルが悪いと思います。これは、最終的にはユーザーの好み次第です。あなたがそれを読んでいる唯一の人であり、あなたがあなたが何をしているかを正確に知っているなら、それは結構です。他の人があなたのコードを共有/使用すると、混乱を招きます。

(2)考えられる唯一のコンセプトは、読み込む配列が複数あるが、それらのサイズが事前にわからない場合です。ただし、追加のオーバーヘッドが深刻な問題でない限り、その場合はArrayList<String>を使用する方が理にかなっています。

(3)ここで何を求めているのかわかりません。つまり、その最初の宣言で、どういうわけか個々の配列の長さを指定できますか?その答えはノーです。

(4)舞台裏では、メモリのチャンクを割り当てて解放するだけなので、プリミティブ配列の長さを拡張および縮小することができます。

1
Deactivator2