当前位置: 首页 > 知识库问答 >
问题:

当对结构相同的对象使用EMF比较时,如何得到正确的差异,而这些对象是根据==而不同的?

养学
2023-03-14

假设我有一个简单的模型(Xcore语法):

class A {
  contains B[] bs opposite a
}

class B {
  String foo
  container A a opposite bs
}

我现在有三个A,创建如下:

A a1 = ModelFactory.eINSTANCE.createA();
B b1 = ModelFactory.eINSTANCE.createB();
b1.setFoo("foo");
b1.setA(a1);

A a2 = ModelFactory.eINSTANCE.createA();
B b2 = ModelFactory.eINSTANCE.createB();
b2.setFoo("bar");
b2.setA(a2);

A a3 = ModelFactory.eINSTANCE.createA();
B b3 = ModelFactory.eINSTANCE.createB();
b3.setFoo("bar");
b3.setA(a3);

当我试着这样比较它们的时候:

DefaultComparisonScope scope = new DefaultComparisonScope(a1, a2, a3);
Comparison comp = EMFCompare.builder().build().compare(scope);
EList<Diff> diffs = comp.getDifferences();

共有1个答案

巫马心水
2023-03-14

这里的问题是EMF Compare不能正确匹配元素,正如您通过添加UUID所认识到的那样。

在我看来,EMF Compare应该能够匹配b元素,因为它们内部有一些可以区分和匹配的东西,但是a本身并不包含任何信息。向元素添加一个UUID可以强制它们的标识,并允许EMF比较来知道谁是谁。

您可以通过添加自己的逻辑来匹配元素来规避这个问题。我假设这不是实际模型(和元模型)的样子,所以您可能有办法更好地区分元素(或者更好地确保模型有标识符)。匹配逻辑可以以多种方式重新定义。一种方法是,如果您的案例包含一种不通过ID属性唯一标识元素的方法,则更改ID函数(负责计算元素ID),或者更改equality helper,以便您可以告诉EMF Compare如何准确地匹配您的对象(文档中没有这方面的示例代码,但您可以在ID函数片段中看到如何更改“equality helper Factory”)。

 类似资料:
  • 两个 NavigableString 或 Tag 对象具有相同的HTML或XML结构时, Beautiful Soup就判断这两个对象相同. 这个例子中, 2个 <b> 标签在 BS 中是相同的, 尽管他们在文档树的不同位置, 但是具有相同的表象: “<b>pizza</b>” markup = "<p>I want <b>pizza</b> and more <b>pizza</b>!</p>"

  • 两个 NavigableString 或 Tag 对象具有相同的HTML或XML结构时, Beautiful Soup就判断这两个对象相同. 这个例子中, 2个 <b> 标签在 BS 中是相同的, 尽管他们在文档树的不同位置, 但是具有相同的表象: “<b>pizza</b>” markup = "<p>I want <b>pizza</b> and more <b>pizza</b>!</p>"

  • 问题内容: 我得到的错误就在这行 。 该怎么办?其他逻辑还可以吗? 我想做的是有一个A列表和一个B列表,其中一个属性与id相同;尽管变量名不同。即在和在B。现在我将两个列表都放在ListAll中,并在相同的变量id / bid上对它们进行排序。我有A和B实现可比性。 和我的listAll是对象类型? 我该怎么做?谢谢。 问题答案: 您可以添加一个通用基类并在那里进行比较,如下所示:

  • 我正在编写一个for循环,它迭代一个数组,该数组在文本文档中包含不同的行。 每次迭代,我都试图提取每个文本数据行的某些部分,并将它们添加到一个对象,即LocaliNodeData。 在每次迭代结束时,我都尝试将localinoData对象(每个对象属性都设置为一个新属性)添加到一个新数组中。 在将每行中找到的字符串添加到数据数组(localinoDataObjArray)时,我会为每个数组获得不同

  • 问题内容: 我需要编写一个比较器,它采用类型A的对象A和类型B的对象B。这两个对象不是公共对象的扩展。它们的确不同,但是我需要通过其中的通用字段来比较这两个对象。我必须使用比较器接口,因为对象存储在Set中,并且在必须对CollectionUtils执行操作之后。我在Google上搜索了一下,发现了Comparator的解决方案,但只有相同的类型。 我试图朝这个方向实施思考,但是我不知道我是否在正

  • 我需要写一个比较器,取一个a类型的对象a和一个B类型的对象B。这两个对象不是一个公共对象的扩展。他们确实是不同的,但我需要比较这两个对象在它的共同领域。我必须使用比较器接口,因为对象存储在Set中,之后我必须使用CollectionUtils进行操作。我搜索了一点点,我用比较器找到了解决方案,但只有相同的类型。 TXS 附注:我在不同的集合中添加两个对象: 之后我会这样想: