何时使用多维数组

时间:2009-06-09 12:01:07

标签: c# .net

在C#中,多维数组的概念非常酷。但我不明白何时使用它们。就像在什么类型的应用程序中使用这个概念一样。

7 个答案:

答案 0 :(得分:8)

当你有多维数据时,不要听起来很陈旧但是你使用多维数组。

矩阵是一个常见的例子,但它可以很容易地成为游戏板(例如国际象棋)或者作为N维迷宫或计数器或其他任何东西的数据模型。

答案 1 :(得分:5)

一个常见的用途是矩阵。

答案 2 :(得分:2)

作为一个侧面,您可以使用多维数组(int [,])或锯齿状数组(int [] [])。前者可以一步初始化,但需要更大的连续内存块并且访问速度较慢,而后者更易于内存,因为子阵列可以分布在地址空间上,每个子阵列都可以不同的长度,所有的一维数组(SZarrays)在CLR中都有特殊的优化。但是,您需要使用锯齿状数组分别初始化每个维度:

int[][] jagged = new int[5][];
for (int i=0; i<jagged.Length; i++)
{
    jagged[i] = new int[10];    // length can be different for each sub-array, if needed
}

多维数组一次初始化

int[,] mArray = new int[5,10];

答案 3 :(得分:1)

想象一下,你想编写一个国际象棋游戏。你会如何用一维数组表示电路板?

答案 4 :(得分:0)

虽然我确信其他人可以提供许多不同的示例,但我使用机器人并且机器人执行的许多任务之一是码垛,将物品放置在托盘上的行和列中。托盘上的每个位置都是阵列的2个甚至3个维度索引。

locationArrayt [row,column]

我们还将它们用于多语言应用程序。字符串数组表示不同的错误消息,第二个索引是语言。

消息[errorNumber,language]

答案 5 :(得分:0)

这段Java片段可能会启发你...它将文件读入二维数组。这是我的MazeOfBolton解决方案的一部分(谷歌)。

  /**
   * Reads the file into a char[rows][cols] matrix.
   * @param String filename - the name of the file to read
   * @return a two-dimensional array of chars containing file contents.
   */
  private static char[][] readMatrix(String filename) throws IOException {
    BufferedReader input = null;
    try {
      input = new BufferedReader(new FileReader(filename));
      List<String> lines = new ArrayList<String>();
      String line = null;
      while ( (line = input.readLine()) != null ) {
        lines.add(line);
      }
      int rows = lines.size();
      char[][] matrix = new char[rows][];
      for (int i=0; i<rows; i++) {
        matrix[i] = lines.get(i).toCharArray();
      }
      return matrix;
    } finally {
      if(input!=null)input.close();
    }
  }

编辑:我应该说为什么我使用矩阵...特别是因为我必须构建一个List来获取数组......嗯?为什么不直接使用List?简短的回答是速度

访问一个数组(多个维度)作为“索引算术”(也就是指针算术)实现(在引擎盖下),因此它不仅访问数组元素O(1),而且快速 O(1)......比等效的 arrayList.get(int index)快得多(当你这样做几百万次时)......并且(算是人为的)算法赛车世界,速度就是一切。

干杯。基思。

答案 6 :(得分:0)

二维数组的一个很好的例子是位图图像。想象一下,图片中的每个像素占据Pixel[1024][768]数组的一个块。因此,要查看屏幕左上角的像素是什么颜色,您会看Pixel[0][0]

三维数组需要更多可视化,但一个典型的例子是在空间中建模点。

我在一个快速而肮脏的Hold'Em模拟器中使用了一个2维数组,我写的这个模拟器代表翻牌前的决定,看起来有点像这样;

_Open = new char[][] 
{             //  2    3    4    5    6   7   8   9   T   J   Q   K   A
    new char [] {'P', 'F', 'F', 'F', 'F','F','F','F','F','F','F','P','P'}, // 2
    new char [] {'F', 'P', 'F', 'F', 'F','F','F','F','F','F','F','P','P'}, // 3 
    new char [] {'F', 'F', 'P', 'F', 'F','F','F','F','F','F','F','P','P'}, // 4
    new char [] {'F', 'F', 'F', 'P', 'F','F','F','F','F','F','F','P','P'}, // 5
    new char [] {'F', 'F', 'F', 'F', 'P','F','F','F','F','F','F','P','P'}, // 6
    new char [] {'F', 'F', 'F', 'F', 'F','P','F','F','P','F','F','P','P'}, // 7 
    new char [] {'F', 'F', 'F', 'F', 'F','F','P','P','P','P','F','P','P'}, // 8
    new char [] {'F', 'F', 'F', 'F', 'F','F','F','P','P','P','P','P','P'}, // 9
    new char [] {'F', 'F', 'F', 'F', 'F','F','F','F','P','P','P','P','P'}, // T
    new char [] {'F', 'F', 'F', 'F', 'F','F','F','F','F','P','P','P','P'}, // J
    new char [] {'F', 'F', 'F', 'F', 'F','F','F','P','P','P','P','P','P'}, // Q
    new char [] {'P', 'P', 'P', 'P', 'P','P','P','P','P','P','P','P','P'}, // K
    new char [] {'P', 'P', 'P', 'P', 'P','P','P','P','P','P','P','P','P'}  // A
};

使用0代表2和12代表Ace。因此,如果模拟器检测到Ace,King它将检查_Open [12] [11]看到'P'(意思是'推'或'全进')并相应地采取行动