Javaでの2D配列の配列長の取得


129

行と列の両方の2D配列の長さを取得する必要があります。次のコードを使用して、これを正常に実行しました。

public class MyClass {

 public static void main(String args[])
    {
  int[][] test; 
  test = new int[5][10];

  int row = test.length;
  int col = test[0].length;

  System.out.println(row);
  System.out.println(col);
    }
}

これは期待どおりに5、10を出力します。

次の行を見てください。

  int col = test[0].length;

列の長さを取得するために、実際には特定の行を参照する必要があることに注意してください。私には、これは信じられないほど醜いようです。さらに、配列が次のように定義されている場合:

test = new int[0][10];

次に、長さを取得しようとするとコードが失敗します。これを行う別の(よりインテリジェントな)方法はありますか?


私は次のリファレンスを非常に包括的に見つけました、programiz.com / java
programming / multidimensional

回答:


182

検討する

public static void main(String[] args) {

    int[][] foo = new int[][] {
        new int[] { 1, 2, 3 },
        new int[] { 1, 2, 3, 4},
    };

    System.out.println(foo.length); //2
    System.out.println(foo[0].length); //3
    System.out.println(foo[1].length); //4
}

列の長さは行ごとに異なります。固定サイズの2D配列で一部のデータをサポートしている場合は、ラッパークラスの固定値にゲッターを提供します。


1
あなたの答えに関する無関係の質問。"{...}"をどこに置くかというテクニック/メソッドは何ですか?オブジェクト定義の後。新しい開発者として、私はこれをますます目にしています。
user432209 2010

まあ、私はそれだけを理解しています:)。このテクニックには具体的な名前があるのではないかと思ったところです。
user432209 2010

名前がわからない-オブジェクトの初期化?インライン初期化?私たちのJava達人の1人は知っています
NG。

8
JLS 10.6と15.10によると、中かっこ部分は単に配列初期化子ですが、newで始まる全体は配列作成式です。
ILMTitan 2010

17

2D配列は長方形のグリッドではありません。あるいは多分もっと良い、Javaの2D配列のようなものはありません。

import java.util.Arrays;

public class Main {
  public static void main(String args[]) {

    int[][] test; 
    test = new int[5][];//'2D array'
    for (int i=0;i<test.length;i++)
      test[i] = new int[i];

    System.out.println(Arrays.deepToString(test));

    Object[] test2; 
    test2 = new Object[5];//array of objects
    for (int i=0;i<test2.length;i++)
      test2[i] = new int[i];//array is a object too

    System.out.println(Arrays.deepToString(test2));
  }
}

アウトプット

[[], [0], [0, 0], [0, 0, 0], [0, 0, 0, 0]]
[[], [0], [0, 0], [0, 0, 0], [0, 0, 0, 0]]

配列testtest2は(多かれ少なかれ)同じです。


12

それを覚えるのは本当に大変でした

    int numberOfColumns = arr.length;
    int numberOfRows = arr[0].length;

なぜそうなのか、そして配列の問題が発生したときにこれをどのように理解できるのかを理解しましょう。以下のコードから、行= 4および列= 3であることがわかります。

    int[][] arr = { {1, 1, 1, 1}, 

                    {2, 2, 2, 2}, 

                    {3, 3, 3, 3} };

arrその中に複数の配列があり、これらの配列を縦に並べて列数を取得できます。行数を取得するには、最初の配列にアクセスし、その長さを考慮する必要があります。この場合、[1、1、1、1]にアクセスするため、行数= 4になります。配列が表示されないという問題が発生した場合は、配列を長方形として視覚化できます。 n X m次元で、最初の配列にアクセスしてからその長さにアクセスすることで行数を取得できると結論付けます。もう1つ(arr.length)は列用です。


8
これは逆です。「この場合、[1、1、1、1]にアクセスするため、行数= 4になります。」実際には、4つの列があることを意味します。
Evan Rosica

正しい@Evan Rosica
Nitin Nanda

5

Javaを使用すると、各「行」の長さが異なる「不規則な配列」を作成できます。正方形の配列があることがわかっている場合は、次のように空の配列から保護するように変更されたコードを使用できます。

if (row > 0) col = test[0].length;

4

この配列がある場合:

String [][] example = {{{"Please!", "Thanks"}, {"Hello!", "Hey", "Hi!"}},
                       {{"Why?", "Where?", "When?", "Who?"}, {"Yes!"}}};

あなたはこれを行うことができます:

example.length;

= 2

example[0].length;

= 2

example[1].length;

= 2

example[0][1].length;

= 3

example[1][0].length;

= 4


以前にも似たような答えを見ましたが、例を使って理解する方が簡単だと思います!

3

すべての多次元配列が長方形であるとは限らないため、言語レベルでより明確な方法はありません。時々ギザギザの(列の長さが異なる)配列が必要です。

独自のクラスを簡単に作成して、必要な機能を抽象化できます。

配列に限定されていない場合は、マルチマップのように、さまざまなコレクションクラスの一部も機能する可能性があります。


1

.length =行数/列の長さ

[0] .length =列の数/行の長さ


1
SOへようこそ。あなたの答えにいくつかの説明を追加する必要があります。
m02ph3u5

0

Javaの2D配列に対して次のプログラムを試してください。

public class ArrayTwo2 {
    public static void main(String[] args) throws  IOException,NumberFormatException{
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        int[][] a;
        int sum=0;
        a=new int[3][2];
        System.out.println("Enter array with 5 elements");
        for(int i=0;i<a.length;i++)
        {
            for(int j=0;j<a[0].length;j++)
            {
            a[i][j]=Integer.parseInt(br.readLine());
            }
        }
        for(int i=0;i<a.length;i++)
        {
            for(int j=0;j<a[0].length;j++)
            {
            System.out.print(a[i][j]+"  ");
            sum=sum+a[i][j];
            }
        System.out.println();   
        //System.out.println("Array Sum: "+sum);
        sum=0;
        }
    }
}

0
import java.util.Arrays;

public class Main {

    public static void main(String[] args) 
    {

        double[][] test = { {100}, {200}, {300}, {400}, {500}, {600}, {700}, {800}, {900}, {1000}};

        int [][] removeRow = { {0}, {1}, {3}, {4}, };

        double[][] newTest = new double[test.length - removeRow.length][test[0].length];

        for (int i = 0, j = 0, k = 0; i < test.length; i++) {
            if (j < removeRow.length) {
                if (i == removeRow[j][0]) {
                    j++;
                    continue;
                }
            }
            newTest[k][0] = test[i][0];
            k++;
        }

        System.out.println(Arrays.deepToString(newTest));   
    }
}

[[300.0]、[600.0]、[700.0]、[800.0]、[900.0]、[1000.0]]をintに変換して出力し、小数点を失います。このソリューションは、入力配列のサイズが常に([x] [1])であることを前提としています
RobynVG

0

を使用するとJava 8、次のようなエレガントな操作を実行できます。

int[][] foo = new int[][] {
        new int[] { 1, 2, 3 },
        new int[] { 1, 2, 3, 4},
    };

int length = Arrays.stream(array).max(Comparator.comparingInt(ArrayUtils::getLength)).get().length

-2
public class Array_2D {
int arr[][];
public Array_2D() {
    Random r=new Random(10);
     arr = new int[5][10];
     for(int i=0;i<5;i++)
     {
         for(int j=0;j<10;j++)
         {
             arr[i][j]=(int)r.nextInt(10);
         }
     }
 }
  public void display()
  {
         for(int i=0;i<5;i++)

         {
             for(int j=0;j<10;j++)
             {
                 System.out.print(arr[i][j]+" "); 
             }
             System.out.println("");
         }
   }
     public static void main(String[] args) {
     Array_2D s=new Array_2D();
     s.display();
   }  
  }

1
これは質問とは関係ありません
alfonso.kim
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.