0

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

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

  entity1
  entity2
  entity3
  entity4

リストを並べ替えます(listAfter)

  entity1
  entity4
  entity2
  entity3

を使用してこれらのリストを比較した結果

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

は:

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

このことから、entity4 がインデックス 3 からインデックス 1 に移動したと推測できます。

同じ比較を繰り返すと、今度は 2 番目のリストに新しい項目を追加します。

  entity1
  entity4
  entity2
  entity3
  entity5

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

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

これは、'entity5' がインデックス (4) に追加され (つまり、3 ではない)、'entity4' が前の例のように移動したという事実を見逃しているようです。

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

明確化をいただければ幸いです。

4

1 に答える 1

1

JaVers には、リストを比較するための 2 つのアルゴリズムがあります。Simple と Levenshtein は、http://javers.org/documentation/diff-configuration/#list-algorithms を参照してください

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

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

私の提案は、レーベンシュタイン距離アルゴリズムを試してみることです。

于 2016-05-24T07:24:53.373 に答える