S-JIS[2016-07-10] 変更履歴

Google java-diff-utils

Googleのjava-diff-utilsのメモ。


概要

java-diff-utils(DiffUtils library)は、Googleの比較ライブラリー。
オブジェクト(String等)のList同士の比較を行い、追加・削除された箇所を返す。
また、その差分をパッチとして、パッチを適用することも出来るらしい。

必要なライブラリーはjava-diff-utilsのjarファイルのみで、他に依存するjarファイルが無いのも利点。


比較対象のオブジェクトは、equals(とhashCode)メソッドが実装されていれば何でもいい。
すなわち、普通のJavaのクラスなら使用できる。


インストール

Gradleを使ってJavaプロジェクトを作っている場合、build.gradleのdependenciesにjava-diff-utilsを追加する。

build.gradle:

〜
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は追加されたデータ。

Java目次へ戻る
メールの送信先:ひしだま