Java 内存对象中扩散的类Levenshtein距离算法?
这里是Java8,不过这个答案应该适用于任何语言 我有一个问题,我需要与对象进行比较,比如说,Java 内存对象中扩散的类Levenshtein距离算法?,java,algorithm,diff,levenshtein-distance,Java,Algorithm,Diff,Levenshtein Distance,这里是Java8,不过这个答案应该适用于任何语言 我有一个问题,我需要与对象进行比较,比如说,Widget,并在它们之间产生一个“差异”:也就是说,如果遵循一组步骤,就会将一个Widget(源)转换成另一个(目标) 类小部件{ //财产等。 } 类WidgetDifference扩展了{ 列表差异(小部件源、小部件目标){ //如果执行,生成的列表将从源转换为目标 //通过一些运行时。 } } 类WidgetTransformer扩展了Transformer{ @凌驾 小部件转换源到目标(小部件
Widget
,并在它们之间产生一个“差异”:也就是说,如果遵循一组步骤,就会将一个Widget
(源)转换成另一个(目标)
类小部件{
//财产等。
}
类WidgetDifference扩展了{
列表差异(小部件源、小部件目标){
//如果执行,生成的列表将从源转换为目标
//通过一些运行时。
}
}
类WidgetTransformer扩展了Transformer{
@凌驾
小部件转换源到目标(小部件源、列表转换){
//不知何故,在“源”上运行“转换”,应该*
//生成具有与相同状态/属性的对象
//原来的目标。
}
}
我知道字符串转换的算法,但是:
- 这只是针对字符串,而不是
小部件
;及
- 它只提供一个整数(将接收器转换为目标所需的转换数),而我需要一个
,当由某个引擎执行时,它将源转换为目标列表
我想知道是否有任何已知的算法来做这种类型的操作。这些算法有可能存在于某个图书馆里吗 我认为这是一个搜索问题。构建一个图,其中目标节点是所需的小部件,开始节点是要转换的小部件。每个步骤(图中的边)表示对小部件的一种可能转换(添加或删除属性)。一旦构建了图形,运行带有路径提取的DFS,您将获得将启动小部件转换为所需小部件所需的步骤(这也是所需的最小步骤数) 如果小部件只是键->值包,那么问题就相当简单了 下面是一个JavaScript(您可以将其用作Java实现的伪代码)版本 O(srcPropCount*lookupTargetProp+targetPropCount*lookupSrcPropCount)
唯一的操作是添加新特性、更新现有特性和删除特性你能将两者转换为JSON或XML和DIFF字符串吗?谢谢@ LasJava(+ 1)-我可以做任何事情,只是想知道是否有针对这类事情的标准算法,并暗中希望JVM空间中的某人已经解决了/实现了它们:-谢谢@ Soad(+ 1)-这确实是一个有趣的想法,我想一个。然而,有三个问题需要马上解决:(1)图形将是巨大的,特别是当
小部件
具有double
或string
属性时(double和string可能有多少个值?!),(2)这个alg如何处理小部件
本身包含子对象的情况,以及(3)您需要某种方法来验证/保证从源到目标的每一条路径实际上都产生了目标,而不是其他东西。我不一定要问这里的算法,只是问已知的算法是否解决了这个问题,它们是什么,以及它们是否用Java实现。再次感谢!如果我们认为转换只是添加/移除给定的属性(没有它的值),那么这些值在目的节点中给出。
class Widget {
// Properties and such.
}
class WidgetDiffer extends Differ<Widget> {
List<Transformation> diff(Widget source, Widget target) {
// The produced list will convert source to target, if executed
// by some runtime.
}
}
class WidgetTransformer extends Transformer<Widget> {
@Override
Widget transformSourceToTarget(Widget source, List<Transformation> transforms) {
// Somehow, run 'transforms' on 'source', which *should*
// produce an object with the same state/properties as
// the original target.
}
}
function diff(src, target) {
var result = [];
for(var key in src) {
if(key in target) {
if(src[key] !== target[key]) {
result.push({op:"update", name:key, value:target[key]});
}
} else {
result.push({op:"delete", name:key});
}
}
for(var key in target) {
if(!(key in src)) {
result.push({op:"add", name:key, value:target[key]});
}
}
return result;
}
console.log(JSON.stringify(diff({}, {a:1, b:2, c:3})));
console.log(JSON.stringify(diff({a:1, b:2, c:3}, {})));
console.log(JSON.stringify(diff({a:1, b:2, c:3}, {b:20, c:30, d:40})));