数组索引的模运算

问题描述 投票:0回答:2

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

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。然后对 current_image_index 与 images.length 进行模数,这将使 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的结果。

java arrays modulo
2个回答
11
投票

...因为 current_image_index%image.length 将始终给出 0 的结果。

不太正确。

模运算符 (

%
) 计算两个操作数的 余数。这是一种重复的减法。事实上,有了
a % b
,你就会问自己:

如果我重复从

b
中减去
a
,直到不再可能进行该操作,剩下多少数字?

让我们用

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.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

因此在

image[2]
之后,会显示
image[0]
。您会看到从 0 而不是 1 开始的索引现在对我们有利。


0
投票

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

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

所以我认为我们都同意

1/2 = 0 R 1

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

所以

1 ‰ 2 = 1
而不是零。

© www.soinside.com 2019 - 2024. All rights reserved.