数组索引的模数运算

时间:2017-06-27 03:54:35

标签: java arrays modulus

我得到了一个关于使用按钮切换一些图像的教程,这里是代码

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]);

我理解的是,一旦我点击按钮,那么int current_image_index将增加1.然后使用images.length模数current_image_index,其中current_image_index的余数除以image.length。例如,我第一次将current_image_index = 0,然后一旦点击,它将是1,然后是current_image_index%image.length = 0.然后是andro.setImageResource(images [0]);

这会一次又一次地重复,因为current_image_index保持为0.那么一旦点击它就会如何不断变化,因为current_image_index%image.length总是会得到0的结果。

2 个答案:

答案 0 :(得分:1)

  

...因为current_image_index%image.length总是会得到0的结果。

不太正确。

模数运算符(%)计算两个操作数的remainder。这是一种重复的减法。事实上,a % b你会问自己:

  

如果我重复从b中减去a,直到该操作无法再进行,那么会保留多少数字?

让我们使用8 % 3进行测试(a = 8b = 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)

因此,在您的情况下,数组索引始终至少为0,最多为images.length - 1。这正是你阵列的有效范围。

假设您有 3 图片,因此images.length 3 。此外,current_image_index已初始化为 0 。所以你会在开头看到image[0]

  1. 您点击一次,current_image_index会增加到1。然后,应用模数运算:1 % 3 = 1
  2. 您再次点击,current_image_index会增加到2。然后,应用模数运算:2 % 3 = 2
  3. 您再次点击,current_image_index会增加到3。然后,应用模数运算:3 % 3 = 0。这意味着指数达到 3 ,但随后由模数运算符立即重置为 0
  4. image[2]之后,显示image[0]。你看到从0开始而不是1的指数现在正在我们的利益中发挥作用。

答案 1 :(得分:0)

current_image_index % images.length作为一个模块。

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

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

在每种编程语言中使用modulo意味着只需占用除法的余数并将其作为操作的结果返回。

所以1 ‰ 2 = 1而不是零。