【发布时间】: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