2016-06-12 71 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循環移動所有剩餘的工作人員,這些工作人員位於您在數組中移除一步之後的位置,以避免空位。這樣最後一個被複制,但是在循環之後被修復。