不同大小的多维数组

27

我刚想到一个测试的点子,试了一下居然成功了:

    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

那么我的问题是:

  • 这种编码风格好还是不好?
  • 这有什么用处?
  • 最重要的是,有没有一种方法可以在声明本身中创建这样的结构?
  • 另外...为什么会有可能这样做呢?

3
没有所谓的“本地2D数组”。它总是一个数组的数组。我认为这样解释得很清楚了。 - MightyPork
1
这被称为锯齿数组,即数组的数组。 - Eng.Fouad
3
这是个好问题,我不明白为什么会有人对它点踩。 - MightyPork
这确实是一个指向数组的引用数组,而不是2D数组。Java没有多维数组的概念,例如Fortran。您无法在声明中指定不同的大小。它可能很有用-考虑存储三角形数组,例如城市之间距离的矩阵。 - Patricia Shanahan
3个回答

27
  • 这种编码风格好还是不好?

和其他事情一样,它取决于情况。有时候所谓的“不规则数组”实际上是合适的。

  • 这个有什么用处呢?

很多。比如,可以将长度不同的数据集存储在一个数组中。例如,如果我们有字符串 "hello""goodbye",我们可能希望将它们的字符数组存储在一个结构中。这些 char 数组长度不同,所以我们会使用不规则数组。

  • 最重要的是,在声明本身中是否有创建这样的结构的方式?

有:

char[][] x = {{'h','e','l','l','o'},
              {'g','o','o','d','b','y','e'}};
  • 另外...为什么这是可能的?

因为Java语言规范允许,§10.6


1
很好的答案。特别喜欢你用字符数组的例子。+1 - William Morrison

14
  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}};

使用大的不规则数组时,它更易读和实用。

  • 根据2中给出的原因是可以实现的。人们有需要使用不规则数组的合理理由,因此语言的创建者为我们提供了一种方法来实现它。

  • 1
    (1) 虽然从技术、功能和语法上讲没有问题,但我认为这是不好的编码风格,因为它打破了对象初始化(String [4] [4])提供的假设。最终,这取决于用户的喜好;如果只有你自己阅读它,并且你确切地知道自己在做什么,那就没问题。如果其他人分享或使用你的代码,这会增加混乱。
    (2) 我能想到的唯一概念是如果你有多个要读取的数组,但事先不知道它们的大小。然而,在这种情况下,使用 ArrayList<String> 更合理,除非额外开销是一个严重的问题。
    (3) 我不确定你在这里问什么。你的意思是,你是否可以在初始声明中指定单个数组长度?对此的答案是否定的。
    (4) 扩展和缩小原始数组长度是可能的,因为在幕后,你只是分配和释放内存块。

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接