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

Posted

技术标签:

【中文标题】用于删除数组项的嵌套 For 循环【英文标题】:Nested For Loops for Array Item Removal 【发布时间】:2018-07-10 21:45:16 【问题描述】:

这可能是一个愚蠢的问题,但是,我一直在从事这个项目,但无法让它发挥作用。我很沮丧,四处试验,让它以某种方式工作。我所做的更改是在 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 个项目,但是在初始化时给该包一个最大容量(用户输入)。如果需要更多信息,请告诉我。提前致谢。

【问题讨论】:

有两个地方你做numOfItem - 1;我会指定导致您混淆的原因(或者如果两者兼而有之)。两者都是此代码不引发错误所必需的。大小为X 的数组具有索引0, 1, ..., X-1;尝试访问stuff[numOfItem] 将导致错误。 【参考方案1】:

如果使用以下步骤找到一个元素,您的代码会尝试从数组中删除它:

第 1 步

找到元素。

第 2 步

a) 如果没有找到,返回false;

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

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

步骤 2 b)中,换档由以下人员完成:

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

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

【讨论】:

我感到困惑的部分是:让我们说数组大小是 5 个元素。因此,如果我想删除最后一个元素,也就是 i=4 上的任何内容。然后代码的下一部分将设置 j=i。因此 j=4,但第二个条件是 j 这是必需的条件,因为 j 应该从 i 开始,直到小于 4。如果我们允许迭代 j=4,那么 stuff[j+1] 将变成 stuff[5]将抛出 ArrayOutOfIndexException,避免此检查是必要的。所以,j 应该小于 4。【参考方案2】:

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

【讨论】:

以上是关于用于删除数组项的嵌套 For 循环的主要内容,如果未能解决你的问题,请参考以下文章

batfor循环嵌套改名

从嵌套for循环中的指针集中删除项目

如何在一个循环执行ajax方法里面嵌套的ajax方法

带有嵌套for循环的Javascript多维数组-无法正常工作

用于嵌套 for 循环的 OpenMP?

嵌套for循环中的python数组[重复]