我有这种方法,如果他的名字以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--;
}
}
}
答案 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循环移动所有剩余的工作程序,这些工作程序位于您在数组中向下移除一个的工作程序之后,以避免打开空格。这样最后一个是重复的,但是在循环之后修复了。