今天与同事讨论一个问题的时候,聊到,一维数组和二维数组是否可以转换的问题,我这里是持肯定态度的,作为一个程序员,这些年开发都是使用高级语言来开发,对这些底层的东西还不是很了解。
但是,我觉得,计算机总归是二进制,无论是什么数据,到最后的底层就是01的数字组合。既然最终结果都是01的数字组合,那就没有能不能转换的问题了。
我下边做了一下尝试。
一维数组转二维数组最重要的是下标计算。我这里使用C#举例。
一个n个元素的一维数组,转换为r行c列的二维数组,对于一维数组中任意一个元素的下标i(0 <= i < n),其对应的二维数组下标为 (i / c, i % c), 显然, 只与列数c有关,而与行数r无关
一维转二维的代码示例:
/// <summary> /// 一维数组转二维数组 /// </summary> /// <returns></returns> public static int[,] OneChangeTwo(int[] oneArray) { // 一维数组长度 int oneArrayLength = oneArray.Length; // 二维数组第一维长度 int twoArrayOneIndex = 5; // 二维数组第二维长度 int twoArrayTwoIndex = 2; // 定义一个固定长度的二维数组 int[,] twoArray = new int[twoArrayOneIndex, twoArrayTwoIndex]; // 将一维数组转换成二维数组 for (int i = 0; i < oneArrayLength; i++) { twoArray[i / twoArrayTwoIndex, i % twoArrayTwoIndex] = oneArray[i]; } return twoArray; }
二维数组转一维数组代码示例:i * array.GetLength(1) + j;(两层循环,i在外层)
/// <summary> /// 二维数组转一维数组 /// </summary> /// <returns></returns> public static int[] TwoChangeOne(int[,] TwoArray) { // 二维数组第一维长度 int twoArrayOneIndex = TwoArray.GetLength(0); // 二维数组第二维长度 int twoArrayTwoIndex = TwoArray.GetLength(1); // 定义一个一维数组,数组长度为二维数组维度乘积 int[] oneArray = new int[twoArrayOneIndex * twoArrayTwoIndex]; // 将二维数组转换成一维数组 for (int i = 0; i < oneArray.Length; i++) { oneArray[i] = TwoArray[i / twoArrayTwoIndex, i % twoArrayTwoIndex]; } return oneArray; }
客户端调用:
static void Main(string[] args) { int[] oneArray = new int[10]{ 0,1,2,3,4,5,6,7,8,9}; // 一维转二维 int[,] resultTwoArray = OneChangeTwo(oneArray); for (int i = 0; i < resultTwoArray.GetLength(0); i++) { for (int j = 0; j < resultTwoArray.GetLength(1); j++) { Console.WriteLine(i+","+j+":"+ resultTwoArray[i,j]); } } Console.WriteLine(""); Console.WriteLine("我是分割线========================================================"); Console.WriteLine(""); int[] resultOneArray = TwoChangeOne(resultTwoArray); for (int i = 0; i < resultOneArray.GetLength(0); i++) { Console.WriteLine(i+":" + resultOneArray[i]); } Console.ReadKey(); }
以上只是实现的部分代码片段,如果看不懂,示例在文末,可下载。
最后放一张示例图:
原文链接:点击这里,走你

