2016-06-12 7 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)) 

Это проверяет, следует ли удалить работника с индексом i.

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

Это для цикла перебирает всех работников с индексом больше или равен I, следовательно, начиная с работником должен быть удален. Он останавливается со второй до последнего индекса, так как он также обращается к работнику с индексом J + 1.

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

Это здесь перемещает рабочий с индексом J + 1 в положение у. Это перезаписывает работника, который будет удален с рабочим со следующим более высоким индексом. Все остальные рабочие только сдвинуты.

} 
    worker[--index] = null; 

Здесь последний рабочий устанавливается в нулевое значение, так как он был сохранен во втором по последней позиции во время цикл. Это гарантирует, что последний рабочий не находится в массиве дважды. Также индекс (число работников) уменьшается с --index, так как в списке меньше одного работника.

i--; 
} 

Теперь я декрементируется, как это уже показатель следующего рабочего, чтобы проверить и цикл будет увеличивать его снова. Без этого рабочий после того, как рабочий только что удалил, не будет проверен.

+0

Leon ваше описание очень полезно :) Теперь я могу понять этот метод. –

0

Второй цикл for перемещает всех оставшихся работников, которые расположены после того, как вы удалили один шаг вниз в массиве, чтобы избежать открытых пространств. Таким образом, последний дублируется, но фиксируется после цикла.