在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 / multiDimension

Answers:


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

好吧,我很了解:)。我只是认为该技术可能有一个特定的名称。
user432209

不知道它的名字是-对象初始化吗?内联初始化?我们的Java大师的人会知道
NG。

8
根据JLS 10.6和15.10,花括号部分只是一个数组初始化程序,而从new开头的整个内容是一个Array Creation Expression。
ILMTitan

17

2D阵列不是矩形网格。也许更好,Java中没有二维数组。

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维,并得出结论,我们可以通过访问第一个数组及其长度来获得行数。另一个(arr.length)用于列。


8
你有这个倒退。“在这种情况下,我们访问[1,1,1,1],因此行数=4。” 实际上,这意味着有4列。
埃文·罗西卡

正确@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

在语言级别上,没有一种更简洁的方法,因为并非所有的多维数组都是矩形的。有时需要锯齿状的(不同的列长)数组。

您可以轻松创建自己的类来抽象所需的功能。

如果您不局限于数组,那么也许各种集合类中的一些也可以工作,例如Multimap


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]]转换为整数以失去小数点。此解决方案假定您的输入数组始终为([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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.