我有一个数字列表。我没有将它们全部绘制成一行,而是按5行绘制列表。
现在我可以选择一个号码,然后向左,向右,向上或向下移动。
在这15个数字的列表中(索引为0到14)我选择了索引11,红色。
如果我向左移动,我必须从我选择的索引中减去1。如果我向右移动,我添加1.向下意味着我添加5和向上意味着我减去5。
然而,如果我在最底行的时候走下坡路,我想在第一行结束,如下:
数学/算法很简单:
index += 5;
if (index > list.size() ) index = index % 5; // % is modulo
//So, since I start with index 11: (11 + 5) % 5 = 1, which is the index of 01.
但是,当我从排在最前面的行开始时,我似乎无法弄清楚要做什么,这会把我带到最底层的行。 (从01开始,我将在11日结束)
如果我有15个项目的清单,那么我可以这样做:
index -= 5;
if (index < 0) index += index.size();
//So: 1 - 5 = -4
// -4 + 15 = 11.
但如果我的列表不能被5整除,那么这不起作用。
所以我正在寻找一种能在所有情况下解决这个问题的算法,包括当列表的大小不能被行的长度分割时。
答案 0 :(得分:2)
这可能会进一步优化,但这是一种方法:
var fullRows = list.Length / NUM_COLUMNS; //using integer division
var maxPos = fullRows * NUM_COLUMNS + currentIndex;
return maxPos < list.Length ? maxPos : maxPos - NUM_COLUMNS;
这样做是通过假设 之后的另一行来获取完整行的数量然后开始。然后它会检查该位置是否确实存在,如果不存在,则将其退回到最后一行内。