【问题标题】:Why use an Array of more than two dimensions?为什么要使用二维以上的数组?
【发布时间】:2009-10-25 23:16:29
【问题描述】:

我无法理解具有多于二维的数组的概念、为什么需要一个以及如何使用它。

例如,您将如何在多维数组中表示以下数据?

性别:男 |女
头发颜色:金色 |布鲁内特 |黑色
眼睛颜色:蓝色 |棕色 |绿色 |榛子

本能告诉我应该这样创建一个数组:

string[,,] personAttributes = new string[2,3,4]

请说明您将如何在没有循环的情况下填充此数组,然后再使用循环。对概念和用法的任何扩展表示赞赏。

【问题讨论】:

    标签: c# arrays multidimensional-array


    【解决方案1】:

    我不会触及您的 personAttributes 示例,因为我认为 2D 数组不是一个好主意,更不用说 3D(我个人会使用结构数组)。

    但是,当您拥有某种正交数据空间(即您有多个相互独立的“选择”)时,多维数组非常有用。

    例如,如果您要存储 20 个人在 10 次测试中的响应时间,其中每个测试重复 3 次,并且整个过程每月完成一次,持续 12 个月,您可能会有这样的数组:

    double[,,,] responseTime = new double [12,20,10,3];
    

    【讨论】:

    • 注意,C# 支持“锯齿状”数组,声明形式为 double[][][][] arrayName。例如,这将允许您每个月有不同数量的人,每个月每个人进行不同数量的测试,等等。但是,此类数组的索引速度较慢。
    【解决方案2】:

    如果您有三个或更多维度的数据,则可能会使用三个或更多维度的数组。所以我猜你很难想象数据的三个维度。

    3-D Tic Tac Toe 怎么样?三维数据的任何离散表示都属于此类别。

    至于头发颜色等属性,我不会为此使用多维数组。酌情使用具有该属性的对象和枚举(例如,作为枚举的性别)。这将比 N 维数组更具可读性

    【讨论】:

      【解决方案3】:

      我想说在您的示例中,多维数组没有意义。在您的情况下,课程更有意义。像存储为成员变量的枚举之类的方法是您可以采用的一种方法:

      enum HAIRCOLORS { BROWN = 0, BLOND = 1 ..... };
      enum SEX { FEMALE = 0, MALE = 1 };
      enum EYECOLORS { GREEN, BLUE, RED .... };
      
      class PersonAttributes 
      {
          public SEX sex = SEX.Female;
          public HAIRCOLORS hairColor = HAIRCOLORS.Brown;
          public EYECOLORS eyeColor = EYECOLORS.Green;
      };
      

      等等……

      【讨论】:

        【解决方案4】:

        为具有多个维度的数据结构建模。棋盘就是一个很好的例子,一个维度是排名,另一个是文件。

        由于您示例中的数据类别(性别、眼睛颜色、头发颜色)与其他类别没有关系,因此最好将其表示为 3 个不同的数组,每个数组都有 1 个维度。

        如果您确实想在多维数组上循环,只需在循环中使用循环:

        for (int i = 0; i < array.length; i++) {
           for (int j = 0; j < array[0].length; j++) {
              string data = array[i][j];
              // do something with the data
           }
        }
        

        【讨论】:

          【解决方案5】:

          将数组视为地址可能会有所帮助。

          123 Main St Springfield MA

          使用此示例,我的第一个数组将是一个状态数组。每个州将拥有一系列城市,而城市拥有街道,最后街道拥有个人地址。

          使用这个数组,我们可以轻松地为每个地址创建一个邮件列表。只需遍历每个数组,您就可以打印出每个地址或您需要做的任何事情。

          看看你的例子,我不认为多维数组很合适。除非您想对数组做的主要事情是找到数据的子集,例如女性/金发/蓝眼睛的人。我会按照建议使用课程。当您查看数组中的人员对象时,您需要知道指向该人员的索引值以找出这些特征。

          另一个可能有用的例子是应用程序中消息的国际化。数组可以是语言、状态(错误、警告、信息)、消息 id(数组消息字符串)。

          至于填充数组,如果对数据进行了排序,则可以使用几个 for 循环。否则解析您的输入数据以识别适当的索引。

          【讨论】:

          • 奇怪的是,我父亲曾经在离您的示例地址非常近的地方工作。真实的故事。
          【解决方案6】:

          正如其他人所写,您的示例不太适合 3D 数组。您的示例似乎更适合 2D 数据结构。一个指标是人,另一个指标是特征:性别、头发颜色、眼睛颜色。或者你可以使用其他一些数据结构......

          一个简单的 3D 数组示例:考虑存储(未压缩的)黑白数字电影。每帧都是具有强度值的 2D 图像 X 与 Y:图像 (i,j)。现在要拥有多个帧来制作电影,您可以将电影存储为图像 (i, j, k),其中 k 随时间变化。如果电影是彩色的,您可以添加第四维来存储三种原色:cimages (i, j, q, k),q=1,2,3,并有一个 4D 数组。

          【讨论】:

            【解决方案7】:

            理解多维数组的最简单方法是将每个数组都视为一维数组。 IE 3维数组是一维数组,一维中的每个元素都是二维数组。

            令人困惑........?

            看这个例子

            Here marks of a student named ABC in 2 exams conduct in the same year is displayed in a 2 dimensional array subject wise.

            现在当只有一个学生时,很容易制作一个二维数组,但如果你必须存储名为 ABC、DEF、GHI 的 3 个学生的分数,你就不能在二维数组中这样做。 为此,我将创建一个一维数组,我可以在其中单独存储每个学生的数据。

            简化.....

            我会将携带每个学生数据的二维数组存储在一个一维数组中,现在一维数组是一个 3 维数组

            Here Class Array is the 3 dimensional Array

            同样,一个 4 维数组也是一个 1 维数组,其中该数组的每个元素都是 3 维数组。

            如果增加属性的数量,数组的维度也会增加,因此我们可以说多维数组用于以有组织的方式存储不相关/正交的数据。

            【讨论】:

              猜你喜欢
              • 2020-05-18
              • 2017-06-22
              • 2012-02-23
              • 1970-01-01
              • 2023-03-30
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多