删除数组并删除工作人员后管理空间
我有这种方法可以删除工人,如果他的名字以从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--;
}
}
}
第二个循环将所有工作人员移动一个靠近数组开头的位置。这样做是为了避免数组中的“空洞”(如果您只将元素设置为null
,就会发生这种情况)。这是发生了什么事情:
if(worker[i].getName().startsWith(s))
这检查是否应该删除具有索引我的工人。
for(int j = i; j < index - 1; j++)
{
这个for-loop循环遍历所有工人的索引大于或等于i,因此从要删除的工人开始。它停止与第二至最后一个索引,因为它也访问与索引j + 1
worker[j] = worker[j + 1];
这在这里与索引j + 1到位置j移动工人的工人。这将覆盖与具有下一个较高索引的工作人员一起被删除的工作人员。所有其他工人只是转移。
}
worker[--index] = null;
这里最后一个worker被设置为null,因为它在for循环中保存在倒数第二个位置。这确保了最后一名工人不在阵列中两次。此外,索引(工人数量)减少--index
,因为列表中有一名工人较少。现在
i--;
}
我递减,因为它已经是下一个工人来检查索引和for循环将再次增加它。如果没有这个,工人刚移走后的工人就不会被检查。
莱昂你的描述是非常有用的:) 现在我可以理解这种方法。 –
第二个for循环移动所有剩余的工作人员,这些工作人员位于您在数组中移除一步之后的位置,以避免空位。这样最后一个被复制,但是在循环之后被修复。
索引变量代表什么,你是否初始化它? – theVoid