对于int数组的迭代

时间:2018-06-24 01:47:04

标签: java

我一直在对数组进行for的实验,并试图使用数组迭代。为什么这两个代码没有做完全相同的事情?第一个效果很好,第二个效果是我试图使其看起来更干净。

/**
 * resetSelectionOn
 * 
 * Module permettant de reinitiliser la selection d'une case et de supprimer
 * le groupe dont elle fait partie
 * 
 * @param emplacement
 */
public void resetSelectionOn(int emplacement) {

    int group = groupID[emplacement];

    for (int i = 0; i < groupID.length; i++) {
        if (groupID[i] == group) {
            groupID[i] = 99;
            selected[i] = false;
        }
    }
    for(int i = 0; i < groupID.length; i++) {
        if (groupID[i] > group) {
            groupID[i]--;
        }
    }

    **// This is the one that isn't working and is suppose to do the exact same thing as the one right over**
    for ( int i : groupID) {
        if(i > group)
            i--;
    }*/

    listeGroupCree.remove(group);

    selected[emplacement] = false;
    nbGroupCree--;
}

有人可以向我解释这两个代码之间的区别吗?谢谢!

group是一个选项卡,其中包含数字所在的组的编号。示例:我随机生成6位数字。假设[1] [2] [3] [4] [5] [6] groupID是一个ArrayList,告诉我在巫婆组中当前使用此数字。例如,如果2和3通过成为同一组的一部分来创建数字23(假设2),则此代码是我的代码,用于重置该组的选择。该组引用了它在ListeGroupCree中的位置。如果23是组号2,则ListeGroupCree [2]将返回23

3 个答案:

答案 0 :(得分:0)

比较两个片段:

for (int i = 0; i < groups.length; i++) {
    groups[i]--;
}

for (int g : groups) {
    g--;
}

第一段将减少groups的每个元素。第二段将什么也不做。这是因为第二段等价于

for (int i = 0; i < groups.length; i++) {
    int g = groups[i];
    g--;
}

因此,您将获得一个新变量,将其递减并丢弃结果。

答案 1 :(得分:0)

要添加,您会注意到其他人指出的相同之处,如果您反编译生成的类文件 注意第一个反编译循环和第二个反编译循环

最适合您的

        for(i = 0; i < this.groupID.length; ++i) {
            if(this.groupID[i] > group) {
                --this.groupID[i];
            }
        }

不适用于您的人

        int[] var7 = this.groupID;
        int var4 = var7.length;

        for(int var5 = 0; var5 < var4; ++var5) {
            int i = var7[var5];
            if(i > group) {
                --i;
            }
        }

如果您注意到,第一个正在处理数组引用。 第二个只是修改原始值。

答案 2 :(得分:0)

for (int i: array) {
    i++;
}

在上面的示例中,i是数组中值之一的本地副本。仅对单次迭代有效。您实质上是在更改副本的值。