数组索引的模运算

4

我有一个使用按钮切换某些图片的教程,以下是代码:

public class MainActivity extends AppCompatActivity {
private static ImageView andro;
private static Button buttonswitch;

int current_image_index = 0;
int[] images = {R.mipmap.andro_img,R.mipmap.apple_image,R.mipmap.ic_launcher,R.mipmap.ic_launcher_round};
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    buttonClick();
}
public void buttonClick() {
    andro = (ImageView) findViewById(R.id.imageView);
    buttonswitch = (Button) findViewById(R.id.button);
    buttonswitch.setOnClickListener(
            new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    current_image_index++;
                    current_image_index = current_image_index % images.length;
                    andro.setImageResource(images[current_image_index]);
                }
            }
    );
}
}

我在这部分真的很困惑:

 @Override
            public void onClick(View view) {
                current_image_index++;
                current_image_index = current_image_index % images.length;
                andro.setImageResource(images[current_image_index]);

我理解的是,一旦我点击按钮,变量 current_image_index 将增加1。然后将 current_image_index 对 images.length 取模,得到的余数即为 current_image_index 除以 images.length 的余数。例如,第一次时 current_image_index = 0,点击后变为 1,再计算 1 % image.length = 0。然后会执行 andro.setImageResource(images[0]);。
由于 current_image_index 始终为 0,这个过程会不断重复。那么如何在点击后让图片不断地改变呢?因为 current_image_index%image.length 总是等于 0,所以需要更改 current_image_index 的值。

2
你说“它将是1,然后current_image_index % image.length = 0”。这是不正确的;image.length是4,所以当current_image_index为0时,结果为0,当为1时,结果为1,当为2时,结果为2,当为3时,结果为3,当为4时,结果为0,因此你得到了环绕。 - Ken Y-N
它正在递增图像计数器。而不是使用条件来检查您是否已经超过了,模数值一旦超过末尾就自动重置为零。 - Fhaab
基本数学 - a%b 的答案始终是 <b。通过加1并取模,可以确保增加的值形成数组的有效索引。 - GAURANG VYAS
我认为你不理解模运算的作用。例如,1模5是1,而不是0。 - Fhaab
@KenY-N 为什么1会得到1?2会得到2?等等...难道模运算不是除法的余数吗? - Anthony Lauly
2个回答

10
不完全正确。
模运算符(%)计算两个操作数的余数。它是一种重复减法。实际上,对于a % b,你会问自己:
“如果我重复从a中减去b,直到这个操作不再可能,那么剩下什么数字?”
让我们用8 % 3(所以a = 8,b = 3)来测试一下。
- 我能从8中减去3吗?可以,结果是5。 - 我能从5中减去3吗?可以,结果是2。 - 我能从2中减去3吗?不行,所以我们的最终结果是2。
逻辑上,操作 a % b 的结果为 r,总是满足 0 <= r < b

例如:
5 % 2 = 1(因为4 ÷ 2 = 2,余数为1)
17 % 6 = 5(因为12 ÷ 6 = 2,余数为5)
20 % 4 = 0(因为20 ÷ 4 = 5,没有余数)

因此,在您的情况下,数组索引始终至少为 0,最多为 images.length - 1。这正是您数组的有效范围。
假设您有3张图片,因此images.length3。另外,current_image_index初始化为0。所以你会在开始时看到image[0]
您单击一次,因此将current_image_index增加到1。然后,应用模运算:1%3 = 1
您再次单击,因此将current_image_index增加到2。然后,应用模运算:2%3 = 2
您再次单击,因此将current_image_index增加到3。然后,应用模运算:3%3 = 0。这意味着索引达到了3,但是随后立即被模运算符重置为0
因此,在显示image [2]之后,将显示image [0]。 您可以看到,从0开始的索引现在对我们有利。

0

current_image_index % images.length 作为模数运算符。

https://en.m.wikipedia.org/wiki/Modulo_operation

所以我认为我们都同意 1/2 = 0 R 1

在每种编程语言中,模运算的意思是简单地取除法的余数,并将其作为操作的结果返回。

因此,1 ‰ 2 = 1 而不是零。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接