Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 内存对象中扩散的类Levenshtein距离算法?_Java_Algorithm_Diff_Levenshtein Distance - Fatal编程技术网

Java 内存对象中扩散的类Levenshtein距离算法?

Java 内存对象中扩散的类Levenshtein距离算法?,java,algorithm,diff,levenshtein-distance,Java,Algorithm,Diff,Levenshtein Distance,这里是Java8,不过这个答案应该适用于任何语言 我有一个问题,我需要与对象进行比较,比如说,Widget,并在它们之间产生一个“差异”:也就是说,如果遵循一组步骤,就会将一个Widget(源)转换成另一个(目标) 类小部件{ //财产等。 } 类WidgetDifference扩展了{ 列表差异(小部件源、小部件目标){ //如果执行,生成的列表将从源转换为目标 //通过一些运行时。 } } 类WidgetTransformer扩展了Transformer{ @凌驾 小部件转换源到目标(小部件

这里是Java8,不过这个答案应该适用于任何语言

我有一个问题,我需要与对象进行比较,比如说,
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})));