배경:
나는 이 문제를 아주 오랫동안 해결했습니다 . 그 안에서 두 가지 버전의 파일을 비교하고 변경 사항을 찾아야 했습니다. 파일의 내용을 배열 형태로 추출하여 배열을 비교하기로 했습니다. 그러다가 오랫동안 바보처럼 행동하고 실수를 하다가 결국에는 상자 안의 종이 위에 배열을 그렸습니다. 사실 이 전에는 다른 해결책을 살펴봤습니다 . 그런데 너무 복잡해서 마스터할 수가 없네요 :) 게다가 기존 파일이 긴 경우와 새 파일이 긴 경우를 대비한 알고리즘이 2가지 있었습니다. 나는 그것을 좋아하지 않았다.내 솔루션의 요점은 다음과 같습니다.
동일한 배열이 2개 있습니다. 본문 전체에서는 이를 "새 어레이" 및 "기존 어레이"라고 부르겠습니다. 그리고 각각에 새로운 요소를 삽입할 수 있습니다. 저것들. 참조 배열은 모든 삭제가 포함된 이전 파일의 내용에 해당하는 배열로 간주됩니다. 이전 파일과 새 파일의 내용은 삽입된 참조로 처리됩니다. 루프에서 두 배열(이전 항목과 새 항목의 내용)을 모두 살펴봅니다. 그리고 그 중 하나에서 삽입을 감지하면 비교된 배열의 동일한 요소가 다시 근처에 있도록 한 단계를 건너뜁니다.연산:
변수: i - OLD 파일의 내용이 포함된 배열 셀의 인덱스입니다. nI - 새 파일의 내용이 포함된 배열 셀의 인덱스입니다. 배열의 요소가 다른 경우 임시 변수에 씁니다. oldMismatch - 누적 배열의 요소 newMismatch - 새 배열의 요소 배열 요소를 반복할 때 다음과 같은 경우가 가능합니다.-
oldMismatch 및 newMismatch 변수는 비어 있습니다. 두 배열의 요소는 동일합니다. Type.SAME을 목록에 씁니다. 계속하세요.
-
oldMismatch 및 newMismatch 변수는 비어 있습니다. 두 배열의 요소는 동일하지 않습니다. 이전 값의 값을 oldMismatch에, 새 값의 값을 newMismatch에 씁니다. 계속하세요.
-
oldMismatch 및 newMismatch 변수는 비어 있지 않습니다. 이를 배열의 현재 요소와 비교합니다.
결론을 내리자. 결과를 목록(lines 변수)에 기록합니다. 배열 중 하나에 대한 루프 단계를 건너뜁니다.
-
3.1 oldMismatch는 NEW 배열의 현재 요소와 같습니다. 이는 파일에 한 줄이 추가되었음을 의미합니다.
이 문자열의 값은 newMismatch에 저장됩니다. 그렇게 적어보자.
lines.add(new LineItem(Type.ADDED, newMismatch)); lines.add(new LineItem(Type.SAME, oldMismatch));
새 파일의 내용을 포함하는 배열에 추가 요소가 있으므로 이전 배열을 기준으로 새 배열의 1 요소를 앞으로 이동해야 합니다.
따라서 OLD 배열은 1 루프 단계를 건너뜁니다.
나--;
-
3.2 newMismatch는 OLD 배열의 현재 요소와 같습니다. 이는 파일에서 한 줄이 제거되었음을 의미합니다. 적어 봅시다.
lines.add(new LineItem(Type.REMOVED, oldMismatch)); lines.add(new LineItem(Type.SAME, newMismatch));
OLD 배열에 추가 요소가 있습니다. 이는 NEW 어레이가 1 루프 단계를 건너뛴다는 의미입니다.
나--;
-
-
배열의 끝을 처리하는 중입니다. 이제 우리는 이전 배열의 끝에 도달했습니다. 여러 가지 가능한 상황이 있습니다
-
4.1 - ArrayIndexOutOfBoundsException - 새 배열이 이전 배열보다 짧습니다. 파일의 마지막 줄이 삭제되었음을 기록합니다.
-
4.2 - 새 배열의 마지막 요소는 우리의 관심 대상이 아닌 채로 남아 있습니다. 추가된 것으로 기록합니다.
-
4.3 - oldMismatch 및 newMismatch 변수가 비어 있지 않습니다. 우리는 다음을 적습니다:
lines.add(new LineItem(Type.ADDED, newMismatch)); lines.add(new LineItem(Type.SAME, oldMismatch));
-
GO TO FULL VERSION