对象集合的分布式更新

本文关键字:更新 分布式 集合 对象 | 更新日期: 2023-09-27 18:31:40

当前程序中我的对象结构被组织成这样,Doc对象包含Mention对象的列表,每个Mention对象都包含Word对象的列表。单词通过它们在文档文本中的位置来识别,并且还存储了一些其他信息(其文本,其词网意义......

在程序的处理中(通过用户交互等) Word可以访问和修改Mention对象值(例如,更新其感知)。用户需要与每个Mention进行交互。

我在这里遇到的问题是,属于同一Doc的几个Mention可能共享一些相同的Word(毕竟,所有单词都在文档中)。那么当这样的单词更新时,我应该如何更新其他Mention中包含的相应Word呢?换句话说,这些Word在文本中的相同位置,应该一起更新,但它们单独存储在提及中。那么一个更新应该如何改变其他更新呢?

我使用的一种方法是,当修改Mention中的Word时,我检索所有提及(从存储的Doc引用中),然后在包含它的任何Mention中更新相应的Word。这需要一个 for 循环,每次更新都会进行 Equals 检查,这是相当多的处理。

我想到的第二种方法是不要在Mention中存储单独的Word列表。只有一个Word s的列表存储在Doc中,并且在每个MentionWord属于Mention的索引存储在一个列表中。所以在更新Word时,我会从Doc的引用中调用一个更新函数来更新Doc的列表。但是,问题在于返回Mention的整个Word列表的函数。我必须返回一个新的Word列表,使用索引,我必须在Doc的列表中选择实际的Word。这是必需的,因为该Mention中的所有Word可能在不久前被其他Mention修改过。或者,我可以检查Word是否已更新并复制更新。但是它仍然需要一个 for 循环遍历Mention中的所有Word,所以它看起来仍然很奇怪(每次检索列表 = 长操作)

我想问的是,此更新问题是否有更好的解决方案。任何帮助都非常感谢:)如有必要,我将在此处添加部分代码。

对象集合的分布式更新

正如我在评论中已经说过的,不要为文档中的同一个单词创建多个Word实例。所以,关于你的评论:文档中的一个物理词永远不会有w1w2。只会有w.

例:

var w = new Word(2, 3, "age", 1)
var mention1 = new Mention(w);
var mention2 = new Mention(w);
mention1.UpdateWord(); // sets the fourth property of w to 3
mention2.PrintWord(); // prints (2, 3, "age", 3)

这有效,因为两个Mention实例都在同一Word实例上工作。