【发布时间】:2011-08-19 22:52:25
【问题描述】:
我希望编写一个算法来同步两个层次结构。这些结构可以是对象图、存储在关系数据库表中的数据等(甚至是两种不同的结构,只要它们具有可比较的键)。同步将是单向的,即一个结构将是原型,另一个将被修改以匹配。
假设我们有一个sync 函数。它需要接受以下内容:
-
objA-- 原型 -
objB-- 要修改的对象 -
keyA--objA的密钥生成函数 -
keyB--objB的密钥生成函数 -
addB-- 创建objB的函数(返回新objB的id) -
setB-- 更新函数objB -
remB-- 删除objB的函数 -
parB--objB的父级的 id -- 这将传递给addB以获取上下文
所以我们有这个:
let sync (objA:'a) (objB:'b) (keyA:'a -> 'k) (keyB:'b -> 'k)
(addB:'p * 'a -> 'p) (setB:'a * 'b -> unit) (remB:'b -> unit)
(parB:'p) = ...
现在我遇到了麻烦。 'a 和 'b 是分层的,因此函数需要知道它应该遍历 'a 和 'b 的哪些属性(一旦比较它们的键并确定它们到目前为止匹配并且应该进一步遍历)。对于这些“子”属性,它需要传递给同步的所有相同参数,但它们各自的类型。
这很明显这是一个数据结构问题。如何将这些信息链接在一起,以便可以将根对象传递给sync,并且它可以向下遍历图形?我最初的想法是将所有参数合并到一个类中,该类将具有 children 属性(同一类型的 ResizeArray)。但是由于各种属性具有不同的类型,我想不出一种方法来使它工作,除了将类型扔出窗口并制作大部分或全部类型参数obj。
所以这是我的问题:
- 是否已经有一种行之有效的方法来执行此操作(我找不到任何东西)
- 我可以使用什么数据结构来封装完成这项工作所需的数据?
我已尽我所能彻底解释这一点,但如果有任何不清楚的地方,请询问,我会尽力提供更好的信息。
【问题讨论】:
-
我猜你需要一个中间数据结构,这个算法可以在上面工作,对于各种类型的数据,你需要将数据转换为中间数据结构,运行算法然后转换它回到原始数据形式
标签: data-structures f# merge object-graph