我有一张号码表。我不是把它们都画成一行,而是把列表画成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除,那么这是行不通的。
因此,我正在寻找一个算法来解决这个问题在所有情况下,包括当一个列表的大小是不可除以它的行长度。
发布于 2014-08-28 17:37:03
这可能会进一步优化,但这里有一种方法:
var fullRows = list.Length / NUM_COLUMNS; //using integer division
var maxPos = fullRows * NUM_COLUMNS + currentIndex;
return maxPos < list.Length ? maxPos : maxPos - NUM_COLUMNS;
这样做是获得完整的行数,然后从假设后面还有一个行开始。然后,它检查该位置是否真的存在,如果不存在,则将一行退到最后的完整行中。
https://stackoverflow.com/questions/25554701
复制相似问题