如何使用模运算符递增和递减整数

How can I increment and decrement an integer with the modulo operator

我正在尝试根据点击增加一个整数。点击如何发生并不重要,所以我会坚持逻辑。我在 Java 中这样做,但逻辑应该完全相同。

int index = 0;

// then within the click event
//arrySize holds the size() of an ArrayList which is 10

index = (index + 1) % arrySize;

按照这个逻辑,用户每点击一次,index就会加1。然后它对arrySize取模导致index在[=11=时回到0 ] 匹配 arrySize

(10 % 10 会使索引回到 0) 这很好,因为它有点像从 0 到 10 然后回到 0 的循环,永远不会超过 10.

我正在尝试执行相同的逻辑,但向后 根据点击,数字将减少并变为 0 然后 回到 arrySize 而不是 -1

我怎样才能实现这个逻辑?

(index + arraySize - 1) % arraySize

做你想做的。

从Java8开始,可以使用Math.floorMod(x, y)方法。引用其 Javadoc(强调我的):

The floor modulus is x - (floorDiv(x, y) * y), has the same sign as the divisor y, and is in the range of -abs(y) < r < +abs(y).

System.out.println(Math.floorMod(-1, 5)); // prints 4

所以你将拥有:

index = Math.floorMod(index - 1, arrySize);

你不能直接 -1 % 5 因为那会输出 -1 based on how the operator % operates with negatives numbers.

index = arraySize - ((index + 1) % arrySize)

如果您想要基于 1 的索引,请使用此选项。例如,如果您想倒退到 1 是一月的月份。

int previous = ((index - 1 - arraySize) % arraySize) + arraySize

结果

index    previous
1        12
2        1
3        2
4        3
5        4
6        5
7        6
8        7
9        8
10        9
11        10
12        11

Example Fiddle