递增时,如何才能使数组的索引“翻转”?

时间:2011-07-26 07:45:38

标签: java arrays indexing

所以我有一个长度为4的数组。当我将它递增1并且数字大于数组的长度时,我希望它能翻转。

例如:

current_index = 3;
current_index++;
//current_index is now 0 again

current_index = 3;
current_index += 2;
//current_index would be 1

current_index = 0;
current_index--;
//current_index would be 3

我目前正在用if-else像这样解决它

if (current_index == textviewlist.length + 1)
     current_index = 0;
else if (current_index == textviewlist.length + 2)
     current_index = 1;
else if (current_index == -1)
     current_index = 3;

但我觉得这不是一个合适的解决方案或“好”的代码。

编辑:我尝试了你的建议,但显然java的行为与负数一样奇怪。 当我尝试

current_index = (current_index - 1) % textviewlist.length;

Java取索引“0”,将其减1(“ - 1”)然后

 -1 % 4 = -1

我预计它会是3,请参阅Wolfram Alpha: -1 mod 4 但显然java%运算符与模运算符不同?

编辑2 :我在这里找到了一个解决方案:Best way to make Java's modulus behave like it should with negative numbers? - Stack Overflow

我可以这样做:

current_index -= 1;
current_index = (current_index % textviewlist.length + textviewlist.length)  % textviewlist.length;

4 个答案:

答案 0 :(得分:6)

您可以使用模运算符。

current_index = (current_index + n) % 4;

答案 1 :(得分:4)

您可以按如下方式使用mod:

current_index = (current_index + i) % 4.

答案 2 :(得分:3)

将增量索引除以数组的长度:

current_index = (current_index + n) % textviewlist.length

答案 3 :(得分:2)

在每次增量之后,只需将其设置为模4或更确切地说,列表的长度。

current_index += 2;
current_index %= textviewlist.length;

或合并:

current_index = (current_index + 2) % textviewlist.length;

你也可以这样做:

current_index += n;
while (current_index >= textviewlist.length) {
    current_index -= textviewlist.length;
}

虽然如果它不比模运算慢,我会感到惊讶,特别是因为你的列表长度是2的幂。

无论哪种方式,将所有这些封装到increment()函数中可能是个好主意:

int increment(int old_index, int n) {
    return (old_index + n) % textviewlist.length;
}

编辑:啊,我没有意识到你在使用Java。 (我认为C的模运算符模仿负数的数学定义)你找到的解决方案略有改进

int increment(int old_index, int n) {
    return (old_index + n + textviewlist.length) % textviewlist.length;
}