【问题标题】:Single array re-indexing for table formatting用于表格格式化的单个数组重新索引
【发布时间】:2015-02-18 16:16:16
【问题描述】:

我正在为以下场景寻找更优雅的解决方案(语言无关紧要,Java 很好,但我目前使用 C#)。假设一个线性数组进入并显示为每行 X 项的表格(例如,9 个项目以每行 3 个项目进入,因此 3 行,每行 3 个)。如果数组的索引为 0 到 8,则当前显示如下:

6 7 8

3 4 5

0 1 2

因此,元素从左到右,从下到上显示。我想重新排列它以从上到下显示,如下所示:

0 1 2

3 4 5

6 7 8

这需要对数组重新排序,以使新数组的索引相对于原始索引为 [6,7,8,3,4,5,0,1,2]。我当前(未经测试)的解决方案如下:假设要返回的数组是“array”,临时副本是“temp”,“cols”变量已经是每行的项目数。

int rows = (array.Length + cols - 1) / cols; //ceiling function to determine rows needed
        int pos = array.Length - cols;  //starting position in index transfer
        int offset = 0;                 //needed when negative index reached
        for (int i = 0; i < rows; i++) 
        {
            for (int j = 0; j < cols; j++)
            {
                if (pos + j >= 0)
                    array[cols * i + j - offset] = temp[pos + j];    //assign values of temp to array
                else
                    ++offset; //takes care of negative indeces
            }
            pos -= cols;
        }

        return array;

问题是由于双循环,这段代码非常不可读并且可能效率低下,尽管我预计不会超过 9 个项目。有没有更优雅的解决方案,使用切片数组、反转或任何不那么难以阅读的东西?这只是一个有趣的小问题,我一直在考虑工作中的一个问题。任何人的意见表示赞赏,谢谢!

值得注意的是,可能会创建不均匀的表(例如,每行 4 项的 9 个元素创建 2 行 4 行,1 行 1。'offset' 变量用于保护负数组索引,如果这是这样)。

【问题讨论】:

    标签: java c# arrays loops slice


    【解决方案1】:

    这就是我想出的:它根本不对您的原始数组进行排序,但每个内部循环都从根据您正在打印的行计算的起始索引开始。如果您有任何问题,请告诉我。这不是针对您的,更具体地针对您的情况,但概念和功能是存在的。

    int[] array = new int[9] { 0, 1, 2, 3, 4, 5, 6, 7, 8 };
    
    int rows = 3;
    int cols = 3;
    
    int count = 0;
    for (int x = 1; x <= rows; x++)
    {
    
        int startingPos = array.Length - (x * rows);
        for (int y = cols; y > 0; y--)
        {
    
            Console.Write(array[startingPos] +", ");
            count++;
            startingPos++;
        }
        Console.WriteLine();
    }
    

    【讨论】:

      猜你喜欢
      • 2017-09-15
      • 2021-05-12
      • 1970-01-01
      • 2021-01-09
      • 1970-01-01
      • 1970-01-01
      • 2022-11-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多