前两天.net老师讲数组,发现了个方法,Array.Clear()。
里面有三个参数 Array array,int index,int length,他们分别是 array类型的相关类,清除的起始索引,清除长度。
看似好像没什么可想象的。但后来发现这个函数居然有重载,那么问题来了,既然没有重载,那么多维数组咋整啊?
大家都知道多维数组的索引肯定不止一个整数,索引数会根据维度的增加而增多的。比如一个二维int[5,5],我要想
从2,3开始清除怎么办呢?这个方法能不能用呢,结果试了下。测试数组如下
int[,] iArray = new int[,] { { 1, 2 }, { 3, 4 }, { 5, 6 }, { 7, 8 }, { 9, 10 }, { 11, 12 } };
一个[6,2]的数组,使用Array.Clear(iArray,3,5)清除,结果如下
发现还真没报错,也是清除了5个数,从[1,1]开始。
可我写的是一维数组的索引啊,怎么会把二维数组清了呢?
由此可见即便我定义的是多维数组,但在计算机看来其实还是一维,只不过根据我写的行数进行分段
好配合我用二维索引进行查找。也就是说计算机在定义数组的时候其实应该有个内置的一维索引。这个
索引在这个二维数组看来应该是这样[0,0]是1,[0,1]是2,[1,0]是3,[1,1]是4。。。。由低到高排列。
那么,既然计算机可以数字个数来换算成二维的索引,那么我们能不能用数字个数来表示二维索引呢?
后来写了下,应该是这样,和十进制差不多,每隔定义的位数进位。比如一个三维数组[4,3,2]
Random r = new Random(); int[, ,] iArray = new int[4, 3, 2]; for (int k = 0; k < 4; k++) { for (int j = 0; j < 3; j++) { for (int i = 0; i < 2; i++) { iArray[k, j, i] = r.Next(0, 99); Console.Write("{0} ",iArray[k,j,i].ToString().PadLeft(2,‘0‘)); } Console.WriteLine(); } Console.WriteLine(); }
拿这个数组来说,应该是4个3行2列的数组,如果数组个数是n,那么表示出来应该是这样,[n/2/3,n/2%3,n%2]
什么意思呢,这个数组是[4,3,2],把他看是一个每一位是不同进制的数,最后一位为2进制,中间一位为3进制,
这样一层一层换算得来的。这个n是如果把这个3维数组换算成一维的索引,举个例子,就那这个[4,3,2]的数组来算
那么这个三维数组应该有4*3*2个数,也就是24个,一个一维的长度为24的数组最后一位索引应该是23。那么我们带进去
看看是不是这个结果。验证方法如下
int n=iArray.Length-1; Console.WriteLine(iArray[n/2/3,n/2%3,n%2]);
结果正好是这个三维数组的最后一个数。
这样也就是说,可以吧任何一个数组当作一个一维数组来看,条件只要换算一下就行。
这个方法看起来似乎没什么用,只是一点点学习数组中的探索。
另外由[4,3,2]这个数组的排列可以看出来,一个三维数组可以由二维形式表现出来。[4,3,2]就是4个[3,2]数组排一排。
那么四维呢[5,4,3,2],就是一个5行4列的大表,每个格子里都是一个[3,2]的小表。五维呢?[6,5,4,3,2],6个[5,4]的
大表排一排,其中每个小格子里放个[3,2]的小表。那么更多维就好解释了。
曾经有好多老师讲数组的时候都说3维以上的表没法解释,但其实用3维表解释更多维也能解释。因为老师在讲3维表的时候
总是用坐标系来解释,但数组和坐标系有个很大的差别,那就是数组的维度肯定都是有限的,定义数组不能不给他制定大小,
但坐标系可以是无限的,就没法累加。如果是有限的坐标系那么就好说了。我当时想是,比如一个四维数组,如果把三维数组
看成是一个箱子(三维分别表示成长宽高),四维就是把这些箱子排一排。五维就是把这些箱子排成一个面,六维就是把这些箱子
按照这个面摞起来,七位就是把6维那些摞高的箱子扔进集装箱再排一排,八维是吧集装箱排成一个面每个里面都是三维小箱子
摞高,九维就是把集装箱摞起来,等等。。。其实都可以解释。同理一维也可以解释一切维度,就跟数组处理我们的多维数组一
样。
以上是我学习数组中的一些想法。