嵌套用于删除数组项的循环

时间:2018-01-31 17:22:53

标签: java arrays for-loop logic nested-loops

这可能是一个愚蠢的问题但是,我一直致力于这个项目并且无法让它发挥作用。我感到很沮丧并经过实验,并以某种方式让它工作。我做的改变是我在numOfItem中加了一个-1。

如果有人能向我解释为什么会这样,我真的很感激。我相信,我的头脑并没有正确阅读代码。我的印象是,如果我删除最后一个索引上的项目,它应该抛出一个错误。

for (int j = i; j < numOfItem - 1; j++)

此代码属于此方法中的嵌套for循环:

//Removes only a single instance of the specified item.
//If the item doesnt exist in the bag, it returns false
public boolean remove(Object item) {
    for (int i = 0; i < numOfItem; i++) {
        if (stuff[i].equals(item)) {
            for (int j = i; j < numOfItem - 1; j++) 
               stuff[j] = stuff[j + 1];
            stuff[numOfItem - 1] = null;
            numOfItem--;
            return true;
        }
    }
    return false;   
}
当对象包被初始化时,

numOfItem被设置为0,以表示包中有0个项目,但是在初始化时给予包最大容量(用户输入)。如果需要更多信息,请告诉我。提前致谢。

2 个答案:

答案 0 :(得分:0)

我假设您指的是stuff[numOfItem - 1] = null行。如果是这种情况,那么答案很简单。数组索引从0开始,而不是1,因此如果你的数组中有50个项目(numOfItem = 50)那么索引将是0,1,2,3 ...... 49没有第50个值因为索引0在技术上是第1个数组中的值。因此,如果您编写stuff[numOfItem] = null,您将尝试访问数组中的第50个索引,但是数组中最大的索引是49,因为它从0开始,而不是1。

答案 1 :(得分:0)

如果使用以下步骤找到元素,则尝试从数组中删除元素:

第1步

找到元素。

第2步

a)如果未找到,则返回false;

b)如果找到,将所有元素从找到元素的索引向左移动。

c)将数组的最后一个索引设置为null。

步骤2 b)转移由以下人员完成:

for(int j = i; j < numOfItem - 1; j++) 
     stuff[j] = stuff[j + 1];  

在上面的代码中,你需要 迭代for循环直到最后一个索引 ,因为最后一个索引需要设置为null 删除元素后减小数组大小如果您尝试迭代最后一个索引,那么stuff[j+1]抛出 ArrayIndexOutOfBoundException。这就是为什么numOfItem -1有效。