在C#中,多维数组的概念非常酷。但我不明白何时使用它们。就像在什么类型的应用程序中使用这个概念一样。
答案 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'(意思是'推'或'全进')并相应地采取行动