zoukankan      html  css  js  c++  java
  • 多维数组会有一维索引吗?

    前两天.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维那些摞高的箱子扔进集装箱再排一排,八维是吧集装箱排成一个面每个里面都是三维小箱子

    摞高,九维就是把集装箱摞起来,等等。。。其实都可以解释。同理一维也可以解释一切维度,就跟数组处理我们的多维数组一

    样。

    以上是我学习数组中的一些想法。

  • 相关阅读:
    Redis使用手册
    log4j.properties 输出指定类日志
    Maven中Jar包冲突,不让某个Jar包打入到工程中
    Cannot refer to the non-final local variable user defined in an enclosing scope
    PANIC: Missing emulator engine program for ‘x86’ CPU.
    Android studio 不能创建Activity等文件
    jenkins打maven包,出现Module Builds里面部分模块没有启动问题
    CentOS7 SFTP服务安装和使用
    记一次阿里云服务器被挖矿程序植入处理(简单记录下)
    利用阿里云高可用虚拟ip+keepalived+mha实现两台mysql的高可用
  • 原文地址:https://www.cnblogs.com/stupidanimal/p/4471307.html
Copyright © 2011-2022 走看看