2016-06-12 103 views
0

我有这种方法可以删除工人,如果他的名字以从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

索引变量代表什么,你是否初始化它? – theVoid

回答

0

第二个循环将所有工作人员移动一个靠近数组开头的位置。这样做是为了避免数组中的“空洞”(如果您只将元素设置为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循环将再次增加它。如果没有这个,工人刚移走后的工人就不会被检查。

+0

莱昂你的描述是非常有用的:) 现在我可以理解这种方法。 –

0

第二个for循环移动所有剩余的工作人员,这些工作人员位于您在数组中移除一步之后的位置,以避免空位。这样最后一个被复制,但是在循环之后被修复。