一维数组与二维数组相互转换

669 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第9天,点击查看活动详情

今天与同事讨论一个问题的时候,聊到,一维数组和二维数组是否可以转换的问题,我这里是持肯定态度的,作为一个程序员,这些年开发都是使用高级语言来开发,对这些底层的东西还不是很了解。

但是,我觉得,计算机总归是二进制,无论是什么数据,到最后的底层就是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();
        }

 

以上只是实现的部分代码片段,如果看不懂,示例在文末,可下载。

最后放一张示例图:

微信图片_20200102193521.png

原文链接:点击这里,走你  

有好的建议,请在下方输入你的评论。

欢迎访问个人博客 guanchao.site