删除工作线程后从阵列中删除并管理空格

时间:2016-06-12 18:38:36

标签: java arrays for-loop void removeall

我有这种方法,如果他的名字以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--;
        }
    }
}

2 个答案:

答案 0 :(得分:0)

第二个循环将所有工作者移动到靠近数组开头的一个位置。这是为了避免&#34;漏洞&#34;在数组中(如果您只将元素设置为null,则会出现这种情况)。这就是:

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

这将检查是否应删除具有索引i的worker。

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

这个for循环迭代所有索引大于或等于i的worker,因此从要删除的worker开始。它以倒数第二个索引停止,因为它还访问索引为j + 1的worker。

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

这会将索引为j + 1的worker移动到位置j。这将覆盖要与具有下一个更高索引的worker一起移除的worker。所有其他工人只会转移。

    }
    worker[--index] = null;

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

    i--;
}

现在我已经减少,因为它已经是要检查的下一个worker的索引,for循环将再次递增它。如果没有这个,工人刚刚搬走后的工人将不会被检查。

答案 1 :(得分:0)

第二个for循环移动所有剩余的工作程序,这些工作程序位于您在数组中向下移除一个的工作程序之后,以避免打开空格。这样最后一个是重复的,但是在循环之后修复了。