【问题标题】:Removing from array and manage spaces after removing a worker移除工作人员后从阵列中移除并管理空间
【发布时间】:2016-10-13 03:59:17
【问题描述】:

如果工人的名字以removeWorker() 方法接受的分配字母开头,我有这种方法可以删除工人。有人可以解释第二个for 循环是如何工作的吗?

public void removeWorker(String s) {
    if (index == 0) {
        System.out.println("There is any worker in array!");
        return;
    }
    for (int i = 0; i < index; i++) {
        if (worker[i].getName().startsWith(s)) {
            for (int j = i; j < index - 1; j++) {
                worker[j] = worker[j + 1];
            }
            worker[--index] = null;
            i--;
        }
    }
}

【问题讨论】:

  • 索引变量代表什么,你初始化它了吗?

标签: java arrays for-loop void removeall


【解决方案1】:

第二个循环将所有工作人员移到离数组开头更近的位置。这样做是为了避免数组中出现“漏洞”(如果您只将元素设置为null,就会出现这种情况)。这就是发生的事情:

if(worker[i].getName().startsWith(s))  

这会检查是否应该删除索引为 i 的工作人员。

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

这个 for 循环遍历索引大于或等于 i 的所有工作人员,因此从要删除的工作人员开始。它在倒数第二个索引处停止,因为它还访问索引为 j + 1 的工作者。

        worker[j] = worker[j + 1];

这里将索引为 j + 1 的工人移动到位置 j。这将使用具有下一个更高索引的工作人员覆盖要删除的工作人员。所有其他工人只被转移。

    }
    worker[--index] = null;

这里最后一个worker设置为null,因为它在for循环期间保存在倒数第二个位置。这可以确保最后一个工作人员不在数组中两次。此外,由于列表中少了一名工人,因此索引(工人数量)减少了 --index

    i--;
}

现在 i 被递减,因为它已经是下一个要检查的工作人员的索引,并且 for 循环将再次递增它。如果没有这个,刚刚移除工人后的工人将不会被检查。

【讨论】:

  • Leon 你的描述很有用:) 现在我可以理解这个方法了。
【解决方案2】:

第二个 for 循环将位于数组中您删除的工作人员之后的所有剩余工作人员向下移动,以避免出现开放空间。这样最后一个是重复的,但在循环之后是固定的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-03
    • 1970-01-01
    • 2018-04-23
    • 1970-01-01
    • 2020-07-02
    • 2016-12-14
    • 2013-04-25
    • 1970-01-01
    相关资源
    最近更新 更多