删除工作人员后从数组中删除并管理空间

Removing from array and manage spaces after removing a worker

如果工人的名字以从 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--;
        }
    }
}

第二个循环将所有工作人员移到更靠近数组开头的位置。这样做是为了避免数组中出现 "holes"(如果仅将元素设置为 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--;
}

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

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