1919 */
2020package difflib .algorithm .myers ;
2121
22+ import difflib .algorithm .Change ;
2223import difflib .algorithm .DifferentiationFailedException ;
2324import difflib .algorithm .DiffAlgorithm ;
2425import difflib .algorithm .DiffException ;
25- import difflib .patch .ChangeDelta ;
26- import difflib .patch .Chunk ;
27- import difflib .patch .DeleteDelta ;
28- import difflib .patch .Delta ;
26+ import difflib .patch .DeltaType ;
2927import difflib .patch .Equalizer ;
30- import difflib .patch .InsertDelta ;
3128import difflib .patch .Patch ;
3229import java .util .ArrayList ;
3330import java .util .List ;
@@ -71,7 +68,7 @@ public MyersDiff(final Equalizer<T> equalizer) {
7168 * Return empty diff if get the error while procession the difference.
7269 */
7370 @ Override
74- public Patch < T > diff (final List <T > original , final List <T > revised ) throws DiffException {
71+ public List < Change > diff (final List <T > original , final List <T > revised ) throws DiffException {
7572 Objects .requireNonNull (original , "original list must not be null" );
7673 Objects .requireNonNull (revised , "revised list must not be null" );
7774
@@ -80,8 +77,9 @@ public Patch<T> diff(final List<T> original, final List<T> revised) throws DiffE
8077 }
8178
8279 /**
83- * Computes the minimum diffpath that expresses de differences between the original and revised
84- * sequences, according to Gene Myers differencing algorithm.
80+ * Computes the minimum diffpath that expresses de differences between the
81+ * original and revised sequences, according to Gene Myers differencing
82+ * algorithm.
8583 *
8684 * @param orig The original sequence.
8785 * @param rev The revised sequence.
@@ -108,9 +106,9 @@ private PathNode buildPath(final List<T> orig, final List<T> rev)
108106 final int kmiddle = middle + k ;
109107 final int kplus = kmiddle + 1 ;
110108 final int kminus = kmiddle - 1 ;
111- PathNode prev = null ;
109+ PathNode prev ;
112110 int i ;
113-
111+
114112 if ((k == -d ) || (k != d && diagonal [kminus ].i < diagonal [kplus ].i )) {
115113 i = diagonal [kplus ].i ;
116114 prev = diagonal [kplus ];
@@ -153,16 +151,16 @@ private PathNode buildPath(final List<T> orig, final List<T> rev)
153151 * @param orig The original sequence.
154152 * @param rev The revised sequence.
155153 * @return A {@link Patch} script corresponding to the path.
156- * @throws DifferentiationFailedException if a {@link Patch} could not be built from the given
157- * path.
154+ * @throws DifferentiationFailedException if a {@link Patch} could not be
155+ * built from the given path.
158156 */
159- private Patch < T > buildRevision (PathNode actualPath , List <T > orig , List <T > rev ) {
157+ private List < Change > buildRevision (PathNode actualPath , List <T > orig , List <T > rev ) {
160158 Objects .requireNonNull (actualPath , "path is null" );
161159 Objects .requireNonNull (orig , "original sequence is null" );
162160 Objects .requireNonNull (rev , "revised sequence is null" );
163161
164162 PathNode path = actualPath ;
165- Patch < T > patch = new Patch <>();
163+ List < Change > changes = new ArrayList <>();
166164 if (path .isSnake ()) {
167165 path = path .prev ;
168166 }
@@ -177,35 +175,29 @@ private Patch<T> buildRevision(PathNode actualPath, List<T> orig, List<T> rev) {
177175 int ianchor = path .i ;
178176 int janchor = path .j ;
179177
180- Chunk <T > original = new Chunk <>(ianchor , copyOfRange (orig , ianchor , i ));
181- Chunk <T > revised = new Chunk <>(janchor , copyOfRange (rev , janchor , j ));
182- Delta <T > delta = null ;
183- if (original .size () == 0 && revised .size () != 0 ) {
184- delta = new InsertDelta <>(original , revised );
185- } else if (original .size () > 0 && revised .size () == 0 ) {
186- delta = new DeleteDelta <>(original , revised );
178+ if (ianchor == i && janchor != j ) {
179+ changes .add (new Change (DeltaType .INSERT , ianchor , i , janchor , j ));
180+ } else if (ianchor != i && janchor == j ) {
181+ changes .add (new Change (DeltaType .DELETE , ianchor , i , janchor , j ));
187182 } else {
188- delta = new ChangeDelta <>( original , revised );
183+ changes . add ( new Change ( DeltaType . CHANGE , ianchor , i , janchor , j ) );
189184 }
190-
191- patch .addDelta (delta );
185+ // Chunk<T> original = new Chunk<>(ianchor, copyOfRange(orig, ianchor, i));
186+ // Chunk<T> revised = new Chunk<>(janchor, copyOfRange(rev, janchor, j));
187+ // Delta<T> delta = null;
188+ // if (original.size() == 0 && revised.size() != 0) {
189+ // delta = new InsertDelta<>(original, revised);
190+ // } else if (original.size() > 0 && revised.size() == 0) {
191+ // delta = new DeleteDelta<>(original, revised);
192+ // } else {
193+ // delta = new ChangeDelta<>(original, revised);
194+ // }
195+ //
196+ // patch.addDelta(delta);
192197 if (path .isSnake ()) {
193198 path = path .prev ;
194199 }
195200 }
196- return patch ;
197- }
198-
199- /**
200- * Creates a new list containing the elements returned by {@link List#subList(int, int)}.
201- *
202- * @param original The original sequence. Must not be {@code null}.
203- * @param fromIndex low endpoint (inclusive) of the subList.
204- * @param to high endpoint (exclusive) of the subList.
205- * @return A new list of the specified range within the original list.
206- *
207- */
208- private List <T > copyOfRange (final List <T > original , final int fromIndex , final int to ) {
209- return new ArrayList <>(original .subList (fromIndex , to ));
201+ return changes ;
210202 }
211203}
0 commit comments