2016-06-12 4 views
0

removeWorker() 메서드에서 지정된 문자로 그의 이름이 시작되면 작업자를 제거하는이 메서드가 있습니다. 누군가 제 2의 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++) 
    { 

for 루프는 인덱스가 i보다 크거나 같은 모든 작업자를 반복하므로 제거 할 작업자로 시작합니다. 또한 인덱스 J + 1

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

이 현재 위치의 J 행 인덱스 J + 1 작업자 이동과 작업자 액세스 그것이 마지막 인덱스 번째로 정지한다. 그러면 제거 할 작업자가 다음으로 높은 인덱스의 작업자로 덮어 씁니다. 다른 모든 근로자는 이동 만합니다.

} 
    worker[--index] = null; 

여기서 마지막 작업자는 for 루프 중에 두 번째에서 마지막 위치에 저장되었으므로 null로 설정됩니다. 이렇게하면 마지막 작업자가 배열에 두 번 나타나지 않습니다. 또한 목록에 근로자가 적으므로 색인 (근로자 수)은 --index으로 감소합니다.

i--; 
} 

이제 i는 점검 할 다음 작업자의 색인이므로 i는 감소하고 for 루프는 다시 증가시킵니다. 이것이 없으면 방금 제거한 작업자는 검사되지 않습니다.

+0

Leon 귀하의 설명은 매우 유용합니다 :) 이제이 방법을 이해할 수 있습니다. –

0

두 번째 for 루프는 열린 공간을 피하기 위해 배열에서 한 단계 아래로 제거한 작업자 다음에있는 나머지 모든 작업자를 배열로 이동합니다. 이렇게하면 마지막 하나가 복제되지만 루프 이후에는 고정됩니다.

관련 문제