java-diff-utils(DiffUtils library)は、Googleの比較ライブラリー。
オブジェクト(String等)のList同士の比較を行い、追加・削除された箇所を返す。
また、その差分をパッチとして、パッチを適用することも出来るらしい。
必要なライブラリーはjava-diff-utilsのjarファイルのみで、他に依存するjarファイルが無いのも利点。
比較対象のオブジェクトは、equals(とhashCode)メソッドが実装されていれば何でもいい。
すなわち、普通のJavaのクラスなら使用できる。
Gradleを使ってJavaプロジェクトを作っている場合、build.gradleのdependenciesにjava-diff-utilsを追加する。
〜 dependencies { compile group: 'com.googlecode.java-diff-utils', name : 'diffutils', version: '1.3.0' testCompile 'junit:junit:4.11' } 〜
List<String>の比較を行う例。
import java.util.Arrays; import java.util.List; import difflib.Chunk; import difflib.Delta; import difflib.Delta.TYPE; import difflib.DiffUtils; import difflib.Patch;
List<String> original = Arrays.asList("zzz", "aaa", "bbb", "ccc", "ddd"); List<String> revised = Arrays.asList( "aaa", "b2", "ccc", "eee", "ddd", "fff", "zzz"); Patch<String> diff = DiffUtils.diff(original, revised); List<Delta<String>> deltas = diff.getDeltas(); for (Delta<String> delta : deltas) { TYPE type = delta.getType(); System.out.println(type); Chunk<String> oc = delta.getOriginal(); System.out.printf("del: position=%d, lines=%s%n", oc.getPosition(), oc.getLines()); Chunk<String> rc = delta.getRevised(); System.out.printf("add: position=%d, lines=%s%n", rc.getPosition(), rc.getLines()); }
↓実行結果
DELETE del: position=0, lines=[zzz] add: position=0, lines=[] CHANGE del: position=2, lines=[bbb] add: position=1, lines=[b2] INSERT del: position=4, lines=[] add: position=3, lines=[eee] INSERT del: position=5, lines=[] add: position=5, lines=[fff, zzz]
DiffUtils.diff()に比較対象のListを渡す。
第1引数が比較元のリスト、第2引数が比較先リスト(新しいリスト)。
Patch#getDeltas()で相違箇所(Delta)の一覧を取得する。(比較結果に違いが無い場合、空のリストが返る)
Deltaが個々の相違箇所を保持している。
TYPEはCHANGE・DELETE・INSERTの列挙型。CHANGEは、いわば削除+追加。
delta.getOriginal()で削除箇所、delta.getRevised()で追加データが取得できる。
TYPE | 説明 | originalの意味 | revisedの意味 |
---|---|---|---|
DELETE | originalからデータが削除される。 | positionは削除された箇所(比較元リストのindex)。 linesは削除されたデータ。 |
使用しない。 linesは常に空。 |
INSERT | originalにデータが追加される。 | positionは追加箇所(比較元リストのindex)。 linesは常に空。 |
positionは追加データがあった箇所(比較先リストのindex)。 linesは追加されたデータ。 |
CHANGE | originalを変更する。 (削除+追加) |
positionは変更箇所(比較元リストのindex)。 linesは削除されたデータ。 |
positionは追加データがあった箇所(比較先リストのindex)。 linesは追加されたデータ。 |