【问题标题】:Changing the column size of 2D array at runtime在运行时更改二维数组的列大小
【发布时间】:2018-04-11 11:03:36
【问题描述】:

在下面的代码中,我定义了一个 (2x2) 二维数组 arr。然后我声明一个包含 5 个元素的一维字符串数组a,并将其分配给二维数组的第一行。为什么允许我这样做,为什么它不抛出数组索引超出界限异常?

我认为这可能是由于引用分配,但我仍然对如何允许在运行时更改数组维度感到困惑。

String a[] = { "1", "2", "3", "4", "5" };

String[][] arr= new String[2][2];

int x;

arr[0] = a;
x = arr[0].length;
System.out.print("The row length is "+ x);

输出:行长为5。

【问题讨论】:

  • @TimBiegeleisen 分配后行长变为 5。
  • 哇,我不知道这个,有点。 arr[0] 是对一维数组的引用,您可以根据需要进行任何分配。在 Java 中,2D(或 3D 等)数组可以是锯齿状的,这意味着第二维不必全部相同。
  • 作为参考,您根本不必定义第二维的长度。 String[][] arr = new String[1][]; 已经有效,但如果您删除第一个维度的大小或仅初始化第二个维度的大小,则会引发错误
  • @XtremeBaumer 所以,看来第二个维度无关紧要..
  • 你用这个做什么?

标签: java arrays matrix


【解决方案1】:

Java 将 arr[0] = a; 视为使用 a 初始化的数组。

this 一个不对称的多维数组。看看这张照片。

另一种创建非对称数组的方法是只初始化数组的第一维, 并在单独的语句中定义每个数组组件的大小:

int [][] args = new int[4][];
args[0] = new int[5];
args[1] = new int[3];

这项技术揭示了您使用 Java 真正得到的东西:数组数组 管理,提供多维效果。

【讨论】:

    【解决方案2】:

    实际发生的是嵌套数组(与 C/C++ 中相同):

    array[][] (actually just array[])
    +---+ +---+ +---+ +---+ +---+
    |   | |   | |   | |   | |   | .
    | 0 | | 1 | | 2 | | 3 | | 4 | .
    |   | |   | |   | |   | |   | .
    +-+-+ +-+-+ +---+ +---+ +---+
      |     |
      v     v
    arr[] arr[]
    +---+ +---+
    |   | |   |
    | 0 | | 0 |
    |   | |   |
    +---+ +---+
    |   | |   |
    | 1 | | 1 |
    |   | |   |
    +---+ +---+
    |   | |   |
    | 2 | | 2 |
    |   | |   |
    +---+ +---+
     ...   ...
    

    所以首先访问数组[],然后访问另一个数组(嵌套数组)。 如果您想要原始性能,请避免这样做,请使用特殊的math matrix lib。 此外,如果矩阵中有很多空单元格,请考虑改用地图。 对于花哨的 ascii 内容,我使用 this

    【讨论】:

      【解决方案3】:

      Java 中没有多维数组。

      String[][] 描述一维数组的一维数组。每个子数组的长度不必相同。

      new String[2][2] 只是

      的语法糖
      String[][] arr = new String[2][]
      arr[0] = new String[2];
      arr[1] = new String[2];
      

      arr[0] = a 将引用从两个元素字符串数组重新分配给另一个 5 元素数组。 2 元素数组不再被引用,偶尔会被 GC 处理。

      要将元素从a 复制到arr,请使用:

      System.arraycopy(a, 0, arr[0], 0, a.length);
      

      哪个会抛出异常。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-10-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多