JavaRush /Java Blog /Random-KO /문제 수준 19 작업 16 해결 옵션(변경 사항 모니터링)
Anton Stezhkin
레벨 41

문제 수준 19 작업 16 해결 옵션(변경 사항 모니터링)

Random-KO 그룹에 게시되었습니다

배경:

나는 이 문제를 아주 오랫동안 해결했습니다 . 그 안에서 두 가지 버전의 파일을 비교하고 변경 사항을 찾아야 했습니다. 파일의 내용을 배열 형태로 추출하여 배열을 비교하기로 했습니다. 그러다가 오랫동안 바보처럼 행동하고 실수를 하다가 결국에는 상자 안의 종이 위에 배열을 그렸습니다. 사실 이 전에는 다른 해결책을 살펴봤습니다 . 그런데 너무 복잡해서 마스터할 수가 없네요 :) 게다가 기존 파일이 긴 경우와 새 파일이 긴 경우를 대비한 알고리즘이 2가지 있었습니다. 나는 그것을 좋아하지 않았다.

내 솔루션의 요점은 다음과 같습니다.

동일한 배열이 2개 있습니다. 본문 전체에서는 이를 "새 어레이" 및 "기존 어레이"라고 부르겠습니다. 그리고 각각에 새로운 요소를 삽입할 수 있습니다. 저것들. 참조 배열은 모든 삭제가 포함된 이전 파일의 내용에 해당하는 배열로 간주됩니다. 이전 파일과 새 파일의 내용은 삽입된 참조로 처리됩니다. 루프에서 두 배열(이전 항목과 새 항목의 내용)을 모두 살펴봅니다. 그리고 그 중 하나에서 삽입을 감지하면 비교된 배열의 동일한 요소가 다시 근처에 있도록 한 단계를 건너뜁니다.

연산:

변수: i - OLD 파일의 내용이 포함된 배열 셀의 인덱스입니다. nI - 새 파일의 내용이 포함된 배열 셀의 인덱스입니다. 배열의 요소가 다른 경우 임시 변수에 씁니다. oldMismatch - 누적 배열의 요소 newMismatch - 새 배열의 요소 배열 요소를 반복할 때 다음과 같은 경우가 가능합니다.
  1. oldMismatch 및 newMismatch 변수는 비어 있습니다. 두 배열의 요소는 동일합니다. Type.SAME을 목록에 씁니다. 계속하세요.

  2. oldMismatch 및 newMismatch 변수는 비어 있습니다. 두 배열의 요소는 동일하지 않습니다. 이전 값의 값을 oldMismatch에, 새 값의 값을 newMismatch에 씁니다. 계속하세요.

  3. oldMismatch 및 newMismatch 변수는 비어 있지 않습니다. 이를 배열의 현재 요소와 비교합니다.

    결론을 내리자. 결과를 목록(lines 변수)에 기록합니다. 배열 중 하나에 대한 루프 단계를 건너뜁니다.

    1. 3.1 oldMismatch는 NEW 배열의 현재 요소와 같습니다. 이는 파일에 한 줄이 추가되었음을 의미합니다.

      이 문자열의 값은 newMismatch에 저장됩니다. 그렇게 적어보자.

      lines.add(new LineItem(Type.ADDED, newMismatch));
      lines.add(new LineItem(Type.SAME, oldMismatch));

      새 파일의 내용을 포함하는 배열에 추가 요소가 있으므로 이전 배열을 기준으로 새 배열의 1 요소를 앞으로 이동해야 합니다.

      따라서 OLD 배열은 1 루프 단계를 건너뜁니다.

      나--;

    2. 3.2 newMismatch는 OLD 배열의 현재 요소와 같습니다. 이는 파일에서 한 줄이 제거되었음을 의미합니다. 적어 봅시다.

      lines.add(new LineItem(Type.REMOVED, oldMismatch));
       lines.add(new LineItem(Type.SAME, newMismatch));

      OLD 배열에 추가 요소가 있습니다. 이는 NEW 어레이가 1 루프 단계를 건너뛴다는 의미입니다.

      나--;

  4. 배열의 끝을 처리하는 중입니다. 이제 우리는 이전 배열의 끝에 도달했습니다. 여러 가지 가능한 상황이 있습니다

    1. 4.1 - ArrayIndexOutOfBoundsException - 새 배열이 이전 배열보다 짧습니다. 파일의 마지막 줄이 삭제되었음을 기록합니다.

    2. 4.2 - 새 배열의 마지막 요소는 우리의 관심 대상이 아닌 채로 남아 있습니다. 추가된 것으로 기록합니다.

    3. 4.3 - oldMismatch 및 newMismatch 변수가 비어 있지 않습니다. 우리는 다음을 적습니다:

      lines.add(new LineItem(Type.ADDED, newMismatch));
      lines.add(new LineItem(Type.SAME, oldMismatch));
추신 - 변수를 재설정하고 nI 변수를 추적하는 것을 잊지 마십시오.
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION