二维数组是使用两个下标(索引)来确定元素的数组
两个下标可以理解成行标和列标
比如矩阵
1 2 3
4 5 6
可以用二维数组int[2,3]表示
好比两行三列的数据集合
1.变量类型[,] 二维数组名;
int[,] arr; 申明过后会在后面进行初始化
2.变量类型[,] 二维数组变量名 = new 变量类型[行,列];
int[,] arr2 = new int[3,3];
3.变量类型[,] 二维数组变量名 = new 变量类型[行,列]{{0行内容1,0行内容2,0行内容3......},{1行内容1,1行内容2,1行内容3....}.......};
int[,] arr3 = new int[3,3]{ {00,01,02},
{10,11,12},
{20,21,22} };
4.变量类型[,] 二维数组变量名 = new 变量类型[ , ]{{0行内容1,0行内容2,0行内容3......},{1行内容1,1行内容2,1行内容3....}.......};
int[,] arr4 = new int[,]{ {00,01,02},
{10,11,12},
{20,21,22} };
5.变量类型[,] 二维数组变量名 = {{0行内容1,0行内容2,0行内容3......},{1行内容1,1行内容2,1行内容3....}.......};
int[,] arr5 = { {00,01,02},
{10,11,12},
{20,21,22} };
1.二维数组长度(数组变量名.GetLength())
int[,] array = new int[,] { { 1,2,3},
{ 4,5,6} };
//我们要获取行和列分别是多长
//得到多少行
Console.WriteLine(array.GetLength(0));//打印结果:2
//得到多少列
Console.WriteLine(array.GetLength(1));//打印结果:3
2.获取二维数组中的元素(数组变量名[行索引下标,列索引下标])
注意:第一个元素的索引是0,最后一个元素的索引肯定是长度-1
//2.获取二维数组中的元素(数组变量名[行索引下标,列索引下标])
Console.WriteLine(array[0,1]);//打印结果:2
Console.WriteLine(array[1,2]);//打印结果:6
//Console.WriteLine(array[3,3]);//报错:
3.修改二维数组中的元素
array[0,0]=99;//类型要统一
Console.WriteLine(array[0,0]);//打印结果:99
4.遍历二维数组
通过循环快速获取二维数组中的每一个元素
for (int i = 0; i < array.GetLength(0); i++)
{
for (int j = 0; j < array.GetLength(1); j++)
{
Console.WriteLine(array[i,j]);
}
}
5.增加二维数组元素
数组初始化以后是不能够直接添加新的元素的,要增加元素需要声明更大空间的数组,然后把原有元素复制过去(原数组依旧存在),再让其指向原数组地址的指向新数组地址
二维数组只能一行一行或者一列一列的加
//开辟更大空间数组
int[,] array2 = new int[3, 3];
for (int i = 0; i < array.GetLength(0); i++)
{
for (int j = 0; j < array.GetLength(1); j++)
{
array2[i, j] = array[i, j];
}
}
//指向原数组地址的数组指向新数组地址
array = array2;//array只是用于指向数组地址的
//赋值检测
array[2, 0] = 7;
array[2, 1] = 8;
array[2, 2] = 9;
for (int i = 0; i < array.GetLength(0); i++)
{
for (int j = 0; j < array.GetLength(1); j++)
{
Console.WriteLine(array[i, j]);
}
}
//打印结果:99,2,3,4,5,6,7,8,9
6.删除数组元素
数组初始化以后是不能够直接删除元素的,要删除的话,原理同上面的增加
注意:将原数组数值复制过来时,循环内长度为新数组长度,否则会造成溢出(新数组长度小于原数组长度)
二维数组只能一行一行或者一列一列的删除
int[,] array3 = new int[3, 2];
//将原数组数值复制过来时,循环内长度为新数组长度
for (int i = 0; i < array3.GetLength(0); i++)
{
for (int j = 0; j < array3.GetLength(1); j++)
{
array3[i, j] = array[i, j];
}
}
//指向原数组地址的数组指向新数组地址
array = array3;
//获取数组行长度
Console.WriteLine(array.GetLength(0));
//获取数组列长度
Console.WriteLine(array.GetLength(1));
//打印结果:3,2
7.查找数组元素
如果要在数组中查找个元素是否等于某个值
通过遍历的形式去查找
int a = 2;
for (int i = 0; i < array.GetLength(0); i++)
{
for (int j = 0; j < array.GetLength(1); j++)
{
if(a==array[i,j])
{
Console.WriteLine("和{0}相等的元素在数组第{1}行,第{2}列位置",a, i+1,j+1);
break;
}
}
}
//打印结果:和2相等的元素在数组第1行,第2列位置
8.总结
1.概念:二维数组是同一变量类型的 行列数据集合
2:一定要掌握的知识:声明,遍历,增删查改
3:所有的变量类型都可以声明为二维数组
4:游戏中一般用来存储矩阵,在控制台小游戏中可以用二维数组来表示地图格子
1.练习题一
将1到10000赋值给一个二维数组(100行100列)
int[,] array = new int[100,100];
int index = 1;
for (int i = 0; i < array.GetLength(0); i++)
{
for (int j = 0; j < array.GetLength(1); j++)
{
array[i,j] = index;
++index;
}
}
2.练习题二
将二维数组(4行4列)的右上半部分置零(元素随机1~100)
int[,] array2 = new int[4, 4];
Random r = new Random();
for (int i = 0; i < array2.GetLength(0); i++)
{
for (int j = 0; j < array2.GetLength(1); j++)
{
if (i < 2 && j > 1)
array2[i, j] = 0;
else
array2[i, j] = r.Next(0,101);
Console.Write(array2[i, j] + " ");
}
Console.WriteLine();
}
3.练习题三
求二维数组(3行3列)的对角线元素的和(元素随机1~10)
int[,] array3 = new int[3, 3];
Random r = new Random();
int sum = 0;
for (int i = 0; i < array3.GetLength(0); i++)
{
for (int j = 0; j < array3.GetLength(1); j++)
{
array3[i, j] = r.Next(1,11);
if (i == j || i + j == 2)
sum += array3[i, j];
Console.Write(array3[i, j] + " ");
}
Console.WriteLine();
}
Console.WriteLine(sum);
4.练习题四
求二维数组(5行5列)中最来元紊值及其行列号(元素随机1~500)
int[,] array4 = new int[5, 5];
Random r = new Random();
int maxI = 0;
int maxJ = 0;
for (int i = 0; i < array4.GetLength(0); i++)
{
for (int j = 0; j < array4.GetLength(1); j++)
{
array4[i, j] = r.Next(1,501);
if(array4[maxI,maxJ]<array4[i,j])
{
maxI = i;
maxJ = j;
}
Console.Write(array4[i, j] + " ");
}
Console.WriteLine();
}
Console.WriteLine("最大值为{0},该数在第{1}行第{2}列", array4[maxI, maxJ], maxI+1, maxJ+1);
5.练习题五
给一个M*N的二维数组,数组元紊的值为0或者
要求转换数组,将含有1的行和列的值全部置为1
int mIndex = 0;
int nIndex = 0;
try
{
Console.WriteLine("请输入行数(非零数)");
mIndex = int.Parse( Console.ReadLine());
Console.WriteLine("请输入列数(非零数)");
nIndex = int.Parse(Console.ReadLine());
}
catch (Exception)
{
Console.WriteLine("请输入数字");
}
int[,] array5 = new int[mIndex, nIndex];
Random r = new Random();
bool[] hang = new bool[mIndex];//行标识
bool[] lie = new bool[nIndex];//列标识
for (int i = 0; i < array5.GetLength(0); i++)
{
for (int j = 0; j < array5.GetLength(1); j++)
{
array5[i, j] = r.Next(0,2);
if (array5[i, j] == 1)
{
//记录当前行列是否要变1的标识
//要变1就为true
hang[i] = true;
lie[j] = true;
}
Console.Write(array5[i, j] + " ");
}
Console.WriteLine();
}
Console.WriteLine("*******分割线*******");
for (int i = 0; i < array5.GetLength(0); i++)
{
for (int j = 0; j < array5.GetLength(1); j++)
{
//满足行列标识为true 变1
if(hang[i]||lie[j])
{
array5[i, j] = 1;
}
Console.Write(array5[i, j] + " ");
}
Console.WriteLine();
}
交错数组是数组的数组,每个维度的数量可以不同
注意:二维数组的每行的列数相同,交错数组每行的列数可能不同
1.变量类型[][] 交错数组名;
int[][] arr1;
2.变量类型[][] 交错数组名 = new 交错数组名[行][];
int[][] arr2 = new int[3][];
3.变量类型[][] 交错数组名 = new 交错数组名[行][]{{一维数组1,一维数组2,.......};
int[][] arr3 = new int[3][]{ new int[] {00,01,02},
new int[] {10,11},
new int[] {20} };
4.变量类型[][] 交错数组名 = new 交错数组名[][]{{一维数组1,一维数组2,.......};
int[][] arr4 = new int[][]{ new int[] {00,01,02},
new int[] {10,11},
new int[] {20} };
5.变量类型[][] 交错数组名 = {{一维数组1,一维数组2,.......};
int[][] arr5 = { new int[] {00,01,02},
new int[] {10,11},
new int[] {20} };
1.交错数组长度
int[][] array = { new int[] { 1, 2, 3 },
new int[] { 4,5 } };
//我们要获取行和列分别是多长
//得到多少行
Console.WriteLine(array.GetLength(0));//打印结果:2
//得到某一行的列数
Console.WriteLine(array[0].Length);//打印结果:3
2.获取交错数组中的元素
注意:不要越界
//2.获取交错数组中的元素(数组变量名[行索引下标][列索引下标])
Console.WriteLine(array[0][1]);//打印结果:2
Console.WriteLine(array[1][1]);//打印结果:5
//Console.WriteLine(array[3][3]);//报错:
3.修改交错数组中的元素
array[0][1]=99;//类型要统一
Console.WriteLine(array[0][1]);//打印结果:99
4.遍历交错数组
通过循环快速获取交错数组中的每一个元素
for (int i = 0; i < array.GetLength(0); i++)
{
for (int j = 0; j < array[i].Length; j++)
{
Console.WriteLine(array[i][j] + " ");
}
Console.WriteLine();
}
//打印结果:1 99 3 4 5
5.增加交错数组元素
//开辟更大空间数组
int[][] array2 = new int[3][];
for (int i = 0; i < array.GetLength(0); i++)
{
//声明临时数组存储原交错数组每一行值,赋予给新交错数组
int[] array3 = new int[array[i].Length];
for (int j = 0; j < array[i].Length; j++)
{
//Console.Write(array[i][j] + " ");
array3[j]= array[i][j];
}
array2[i] = array3;
}
//指向原数组地址的数组指向新数组地址
array = array2;//array只是用于指向数组地址的
//赋值检测
array[2] = new int[] { 1, 2, 3 };
for (int i = 0; i < array.GetLength(0); i++)
{
for (int j = 0; j < array[i].Length; j++)
{
Console.Write(array[i][j]+" ");
}
Console.WriteLine();
}
//打印结果:1 99 3
// 4 5
// 1 2 3
6.删除数组元素
int[][] array4 = new int[2][];
for (int i = 0; i<array4.GetLength(0); i++)
{
//声明临时数组存储原交错数组每一行值,赋予给新交错数组
int[] array3 = new int[array[i].Length];
for (int j = 0; j < array[i].Length; j++)
{
array3[j] = array[i][j];
}
array4[i] = array3;
}
array = array4;
for (int i = 0; i < array.GetLength(0); i++)
{
for (int j = 0; j < array[i].Length; j++)
{
Console.Write(array[i][j] + " ");
}
Console.WriteLine();
}
//打印结果:1 99 3
// 4 5
7.查找数组元素
如果要在数组中查找个元素是否等于某个值
通过遍历的形式去查找
int a = 99;
for (int i = 0; i < array.GetLength(0); i++)
{
for (int j = 0; j < array[i].Length; j++)
{
if(array[i][j]==a)
{
Console.Write("和{0}相等的元素在数组第{1}行,第{2}列位置", a, i + 1, j + 1);
}
}
Console.WriteLine();
}
//打印结果:和99相等的元素在数组第1行,第2列位置