多维数组会有一维索引吗?

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

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

样。

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

时间: 2024-11-10 00:54:32

多维数组会有一维索引吗?的相关文章

二维数组转化成一维指针

二维数组转化为一维指针来使用本实例用到了随机数,链表生成,遍历,有待扩展 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<time.h> 4 #include<math.h> 5 //定义个结构体Emp用来存放员工信息 6 typedef struct Emp 7 { 8 int eno; 9 char *ename; 10 int dno; 11 Emp *next; 12 13 }emp,*pemp

reduce实现计算数组中每个元素出现的次数 数组去重 将多维数组转化为一维

// js计算数组中每个元素出现的次数 // var names = ['Alice', 'Bob', 'Tiff', 'Bruce', 'Alice']; // var countedNames = names.reduce(function (allNames, name) { // if (name in allNames) { // allNames[name]++; // } // else { // allNames[name] = 1; // } // return allName

HDU 1024 Max Sum Plus Plus(二维数组转化为一维数组)

Problem Description: Now I think you have got an AC in Ignatius.L's "Max Sum" problem. To be a brave ACMer, we always challenge ourselves to more difficult problems. Now you are faced with a more difficult problem. Given a consecutive number seq

怎么把大数据的二维数组转化为一维数组????

今天做了一场比赛发现一个题卡死在数据上,原本要开一个二维数组a[2e5][2e5]但是这样肯定要re.我一直卡死在这个地方,比赛中想到了一个方法. 那就是用string数组去计数,那样就可以开一个st[2e5]的数组就可以了...然而这样伴随着一些问题.我发现直接用st[i][j]=t;这样是不对的,输出发现没有输出数据!!! 后来我发现必须先把string数组的每一个元素先赋值一个东西,因为我表示的是一个矩阵,所以我把string数组的每一个元素,也是一个string,这里定义为ss了,那么如

PHP二维数组转换成一维数组,一个变量多个二维数组转换成一维数组,PHP二维数组(或任意维数组)转换成一维数组的方法汇总,array_reduce(); array_walk_recursive(); array_map();

方法汇总: 1. array_reduce函数法 //用array_reduce()函数是较为快捷的方法: $result = array_reduce($user, function ($result, $value) { return array_merge($result, array_values($value)); }, array()) 2. array_walk_recursive函数法 //用array_walk_recursive()函数就非常灵活,可以把任意维度的数组转换成一

PHP 将二维数组转成一维数组

$authArrs = array();  //待转的数组 $authIds = array(); //声明一个空数组 array_walk_recursive($authArrs, function($value) use (&$authIds) { array_push($authIds, $value); }); 原文地址:https://www.cnblogs.com/soiq-1123/p/9450993.html

将二维数组转换成一维数组(基于reduce)

reduce:不改变原数组,返回一个新的数组.就是遍历数组元素,从头开始,依次往下,第一个参数是上一次的返回值,第二个参数是下一个数组元素,首次的时候第一个和第二个参数分别是 array[0],  array[1] : let flat=[[1,2,3],[4,5,6],[6,7,8]].reduce(function(prev,next){ return prev.concat(next);//循环将数组进行拼接 }); console.log(flat); 原文地址:https://www.

js 多维数组转成一维数组

1 var arr = [1, 2, [3, 4, [5, 6, 7]]]; 2 var resultArr = []; 3 function forEachArr(arr) { 4 for (var i = 0; i < arr.length; i++) { 5 if (arr[i] instanceof Array) { 6 arguments.callee(arr[i]); 7 // forEachArr(arr[i]); 8 } else { 9 resultArr.push(arr[i

C++入门经典-例6.10-将多维数组转换成一维数组

1:代码如下: // 6.10.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> using namespace std; void main() { int array1[3][4]={{1,2,3,4}, {5,6,7,8}, {9,10,11,12}}; int array2[12]={0}; int row,col,i; cout << "array old"