用于表格式设置的单个数组重新索引

本文关键字:新索引 索引 数组 格式 表格 设置 单个 用于 | 更新日期: 2023-09-27 18:34:47

我正在寻找以下场景的更优雅的解决方案(语言无关紧要,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 个项目。有没有更优雅的解决方案,使用切片数组、反转或任何不难阅读的东西?这只是我一直在思考的一个有趣的小问题。感谢任何人的投入,谢谢!

值得注意的是,可以创建可能不均匀的表(例如,9 个元素,每行 4 个项目,创建 2 行 4 行,一行 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();
}