2016-05-23 6 views
0

私は、コンテナの変更(v1.6.0)を解釈することによって、エンティティの2つのリストのdiffをより人間が読める形式に変換しようとしています。Javersリストの比較

私は、エンティティのリスト(listBefore)がある場合:

entity1 
    entity2 
    entity3 
    entity4 

を、私は(listAfter)

entity1 
    entity4 
    entity2 
    entity3 

使用してこれらのリストを比較した結果リストを並べ替える

Javers.compareCollections(listBefore, listAfter, Entity.class) 

は:

このことから

私はそれを推測することができますentity4は、私は同様の比較を繰り返した場合は、この時間が第2のリストに新しい項目を追加する1.

インデックスにインデックス3から移動:

entity1 
    entity4 
    entity2 
    entity3 
    entity5 

比較の結果は次のとおりです。

containerChanges:[(3).'entity4'>>'entity5', (1).added:'entity4'] 

これは「entity5」のインデックスに追加されたという事実を見逃しているようだ(4)(すなわちnot 3)と 'entity4'は前の例のように移動しました。

更新:上記の例では、Levenshteinコンパレータを使用しています。

任意の明確化が認められるであろう。

答えて

0

JaVersは、リストを比較するための2つのアルゴリズムを持っていますシンプルでレーベンシュタイン がhttp://javers.org/documentation/diff-configuration/#list-algorithms

を参照してください単純なアルゴリズムは、主にその速度ので、デフォルトで使用されます。 Levenshteinはよりスマートですが、非常に大きなリストでは遅くなる可能性があります。 JaVersから:

SIMPLEアルゴリズムは、シフトされた要素の変更を生成します(リストの途中で要素を挿入または削除する場合)。逆に、Levenshteinアルゴリズムは、要素がシフトした場合でも、短く明確な変更リストを計算します。シフトされた要素のインデックスの変更は気にしません。

私の提案は、Levenshtein距離アルゴリズムを試してみてください。

+0

申し訳ありませんが、私は明らかにすべきです - 私はLevenshtein距離アルゴリズムを使用しています。そのため、最初の例では、entity2とentity3の移動を無視しています。新しい要素をリストに追加すると、結果が正しく表示されません(上記の2番目の例)。 – stacktrace

+0

現在、私は2つのリストの中で最も長くなっているサブシーケンスを使ってカスタム比較を行っています。サブシーケンス(または追加または削除)の一部ではない要素は、あるインデックスから別のインデックスへの移動と見なされます。問題は、フレームワークが「並べ替え」変更タイプをサポートしていないため、通常の変更処理の外でこれを処理する必要があることです。 – stacktrace

+0

JaVersリスト比較アルゴリズムでは、移動の概念はありません。移動後、あなたが言及したように、ValueAddedとValueRemovedという2つの変更が報告されます。 –