【问题标题】:Is It Possible to Point to Multiple Arrays Within Arrays?是否可以指向数组中的多个数组?
【发布时间】:2011-07-06 16:19:27
【问题描述】:

所以对于我正在做的一个项目,我希望能够创建一个看起来像这样的多维数组:

private static String[][] docArray = new String[6][];

对于那个数组,我会建立类似的东西:

docArray[0].equals(headingValue);
.
.
.
docArray[5].equals(anotherValue);

然后说我想做一些事情,比如让索引 3 指向一个子数组,从逻辑上讲,我认为你会做以下事情(尽管我知道这不是正确的语法)...

docArray[3][1] = new String[6][];

到目前为止,我的逻辑是否正确,如何继续添加指向新数组的指针?提前感谢您的帮助。

【问题讨论】:

    标签: java arrays pointers multidimensional-array


    【解决方案1】:

    问题在于如果docArrayString[][],那么docArray[3][1] 应该是String,而不是String[][]

    可以做的是将docArray 输入为Object[][];这将允许您做您想做的事情,因为每个 String 是一个 Object 并且一个锯齿状的 String[][] 数组也是一个 Object

    【讨论】:

    • 所以我可以将它们都称为 Object[][] 类型,而不是调用任何数组类型 String[][]?这样做会有什么缺点吗?
    • @This 0ne Pr0grammer:缺点是你可以在其中放入除String 对象以外的东西,自然而然。但是你总是可以编写自己的类来包装这个结构并控制对它的访问。
    • 所以,如果我有类似 docArray[3][0] = (new Object[6][]); 的东西,我如何访问该新数组以在其中存储另一个数组?
    • @This 0ne Pr0grammer:你必须这样做:Object[][] subArray = (Object[][])docArray[3][0]; 然后你可以以Object[][] 的身份访问subArray
    • Kk,我试试看。非常感谢。
    【解决方案2】:

    因为docArray[3]也是一个数组,所以你可以这样做......

    docArray[3] = new string[4]; //4 for example

    如果内存服务正确,这称为交错数组。

    【讨论】:

    • 但是,如果我希望新数组也成为多维数组(与前一个数组相同),这对我的目的有用吗?
    【解决方案3】:

    我认为您正在寻找的是以下语法:

    String[][] s2d = new String[3][]; // creates a 2-Dimensional Array with 3 rows (or columns, depending on how you index/address
    s2d[0] = new String[4] // creates a new 1-Dimensional Array with 4 columns (at row 0)
    s2d[1] = new String[26] // creates a new 1-Dimensional Array with 26 columns (at row 1)
    s2d[0][0] = "This is a cell at row 0, column 0"
    

    【讨论】:

    • 我不确定这正是我想要的,但我感谢您的意见。
    【解决方案4】:

    我认为这里的关键概念是,无论你如何声明它,在 Java 中,任何东西的数组都只是一个普通对象,定义为给定类型的一系列元素,因此对象数组可以包含其他数组。

    JVM 不支持以不同方式处理多维数组。所以只有两种类型的数组:

    F[] 数组,其中 F 是基本类型(int、float 等) O[] 数组,其中 O 是任何其他类型 - 包括数组( O = F[] 或 O = O'[] )

    因此,对于您的问题,您可以制作数组数组,没有什么能阻止您。只要意识到您只是在访问对象引用的一维数组。

    语法 ((array[i][j])[m][n]) 与 (((((array[a])[b]))[c])[d]) 没有什么不同

    通过阅读您的问题和之前的答案,我将提供以下建议:尽可能保持强类型,因为您只能在深入研究多维数组时丢弃类型信息,而永远无法添加它。在一个简单的形式中,您可以使用多种简单类型来表示您的文档:

    class Line extends ArrayList<String> {}
    
    class Paragraph extends ArrayList<String> { public Line[] getLines(); } 
    class TextParagraph extends Paragraph {}
    class QuotedParagraph extends Paragraph {} 
    class HeadingParagraph extends Paragraph {}
    
    class Document { public static void main (String[] args) { 
      Paragraph[] multiDiDoc = new Paragraph[10]; 
      multiDiDoc[0] = new HeadingParagraph();
    } }
    

    使用对象模型,您可以保留通用性('HeadingParagraph'、'QuotedParagraph'、'TextParagraph' 类型),并支持特定性(不允许使用 Object 类型的任意对象)。

    如果您坚持使用原始对象,随着您的客户端应用程序变得越来越大,您会越来越多地想知道您是否会遇到类转换异常。

    【讨论】:

    • 如果我想走这条路,那么看看这个答案。我会使用 Line 类、Paragraph 类、HeadingParagraph 类,当然还有 Document 类。这些将是代表我将存储在数组中的元素的类。但是,在数组中,我想存储指向兄弟节和子节的指针。那么我该如何创建这样的课程呢?
    • 我会从段落中取出 getLines,并将其添加到 TextParagraph 并使 QuotedParagraph 扩展 TextParagraph。然后,您可以将 Paragraph 用作可以包含同级部分或子部分的通用元素。我不确定兄弟部分背后的语义,但听起来你想要一个列表类型的数据结构而不是数组数据结构。根据您的勇气和文档的大小,您可以查看跳过列表。 class Para { public Para prev();公共对下一个();公共列表 children(); } 段 docHead;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-19
    • 1970-01-01
    • 2023-01-01
    • 2010-11-04
    • 2011-03-04
    • 1970-01-01
    • 2011-06-07
    相关资源
    最近更新 更多