【问题标题】:Distributed updating of object collections对象集合的分布式更新
【发布时间】:2013-09-17 11:08:09
【问题描述】:

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

在程序的处理中(通过用户交互等)。Word对象里面有一个Mention可以访问和修改值(例如更新它的意义)。与每个Mention 的用户交互是一项要求。

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

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

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

我想问的是这个更新问题有没有更好的解决方案。任何帮助深表感谢 :) 如果有必要,我会在这里添加我的部分代码。

【问题讨论】:

  • 为什么文本中有多个 Word 对象实例用于相同的物理单词?您应该只有一个在所有需要使用它的Mention 实例之间共享。
  • 是的,您所指的是在我的第二种方法中实现的。当我想检索“可能”更新版本的单词列表以供提及时,它仍然存在问题。
  • 不,不一样。我的观点是每个Mention 都有一个Words 列表——而不是它们的索引——并且可以简单地更新那个Word 实例。由于其他包含相同单词的Mentions 具有完全相同的Word 实例,因此它们将始终自动在最新版本上运行。无需手动更新。
  • 这怎么可能?看来你在这里误解了一些东西。例如:首先 Word w1 = (2,3,"age",1), w2 = (2,3,"age",1) 在 Doc 中应该是同一个单词。那么当你更新 w1 时: w1 = (2,3,"age",3) 那么如何更新 w2 呢?它属于另一个列表,在另一个 Mention 对象中,它的第四个成员仍然是 1。这里的问题是每个 Mention 单独存储一个单词列表。最初它们是相同的,但如果它们改变了呢?
  • 你想让w2的第四个成员保持1,即使在更新之后?还是应该更新到 3?

标签: c# list design-patterns class-design


【解决方案1】:

正如我在 cmets 中已经说过的,不要为文档中的同一个单词创建多个 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 实例上工作。

【讨论】:

  • 但问题是我从另一个程序接收到我的输入。特别是,提及及其相应的单词存储在一个文本文件中: Mention1 w1_2_3_"age" w2_8_5_after"... 那样。我必须解析这些文本来创建提及。所以在你回答之后我想我必须有一个首先找到所有单词的初始阶段。只有这样我才能使用每个提及的特定单词创建每个提及。我想我之前真的有点困惑:(
  • @ramcrys 您可以使用字典存储 Word 实例中的某个单词,并在文件中下一次出现相同单词时使用该存储实例。如果您不明白这一点,请将此类文件粘贴到 pastebin.com,以便我向您展示一些实际适用于您的案例的代码。
  • 对不起,我之前做的时候真的很困惑。既然你指出来了,我可以解决它。非常感谢您的帮助。
  • @ramcrys:很好。祝你好运:-)
猜你喜欢
  • 1970-01-01
  • 2016-08-08
  • 1970-01-01
  • 1970-01-01
  • 2011-02-05
  • 2019-04-11
  • 2020-11-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多