Scala:计算两个字符串之间的编辑距离
Scala: Calculate levenshtein distance between 2 strings
我正在尝试计算 2 个字符串之间的编辑距离。
我得到了 Java 代码,它工作正常,如下所示
static int compute_Levenshtein_distance(String str1,
String str2)
{
if (str1.isEmpty()) {
return str2.length();
}
if (str2.isEmpty())
{
return str1.length();
}
int replace = compute_Levenshtein_distance(
str1.substring(1), str2.substring(1))
+ NumOfReplacement(str1.charAt(0),str2.charAt(0));
int insert = compute_Levenshtein_distance(
str1, str2.substring(1))+ 1;
int delete = compute_Levenshtein_distance(
str1.substring(1), str2)+ 1;
return minm_edits(replace, insert, delete);
}
static int NumOfReplacement(char c1, char c2)
{
return c1 == c2 ? 0 : 1;
}
static int minm_edits(int... nums)
{
return Arrays.stream(nums).min().orElse(
Integer.MAX_VALUE);
}
public static void main(String args[])
{
String s1 = "glomax";
String s2 = "folmax";
System.out.println(compute_Levenshtein_distance(s1, s2));
}
现在我已经将上面的代码转换为如下的 scala 代码,但是出现了低于 2 的错误我已经评论了
def compute_Levenshtein_distance(str1: String, str2: String): Int = {
if (str1.isEmpty) return str2.length
if (str2.isEmpty) return str1.length
val replace = compute_Levenshtein_distance(str1.substring(1), str2.substring(1)) + NumOfReplacement(str1.charAt(0), str2.charAt(0))
val insert = compute_Levenshtein_distance(str1, str2.substring(1)) + 1
val delete = compute_Levenshtein_distance(str1.substring(1), str2) + 1
minm_edits(replace.toInt, insert.toInt, delete.toInt) // **Error1:- return type expected is INt but found Any**
}
def NumOfReplacement(c1: Char, c2: Char) = {
if (c1 == c2) 0
else 1
}
def minm_edits(nums: Int*) = {
Arrays.stream(nums).min.orElse(Integer.MAX_VALUE) // **Error2:- Cannot resolve overloaded method 'Stream'**
}
def main(args: Array[String]) = {
val s1 = "glomax"
val s2 = "folmax"
System.out.println(compute_Levenshtein_distance(s1, s2))
}
因为我在 scala 中处于非常初级的水平...我不明白我该如何解决它。
有人可以帮我解决这个问题吗?
出现错误 #2 的原因是您试图将 Scala Seq[Int]
传递给 java 标准库 Array.streams
函数,该函数不接受 Scala 集合。
因此,minm_edits
的 return 类型不会被推断为 Int
,因此错误 #1 告诉您尽管您声明了 return compute_Levenshtein_distance
类型为 int,Scala 编译器无法判断 minm_edits
return 是一个 int。
通过修复 minm_edits
(使用 scala 标准库而不是 Java 库)这两个错误都会消失。
def minm_edits(nums: Int*) = {
nums.minOption.getOrElse(Integer.MAX_VALUE)
}
我正在尝试计算 2 个字符串之间的编辑距离。
我得到了 Java 代码,它工作正常,如下所示
static int compute_Levenshtein_distance(String str1,
String str2)
{
if (str1.isEmpty()) {
return str2.length();
}
if (str2.isEmpty())
{
return str1.length();
}
int replace = compute_Levenshtein_distance(
str1.substring(1), str2.substring(1))
+ NumOfReplacement(str1.charAt(0),str2.charAt(0));
int insert = compute_Levenshtein_distance(
str1, str2.substring(1))+ 1;
int delete = compute_Levenshtein_distance(
str1.substring(1), str2)+ 1;
return minm_edits(replace, insert, delete);
}
static int NumOfReplacement(char c1, char c2)
{
return c1 == c2 ? 0 : 1;
}
static int minm_edits(int... nums)
{
return Arrays.stream(nums).min().orElse(
Integer.MAX_VALUE);
}
public static void main(String args[])
{
String s1 = "glomax";
String s2 = "folmax";
System.out.println(compute_Levenshtein_distance(s1, s2));
}
现在我已经将上面的代码转换为如下的 scala 代码,但是出现了低于 2 的错误我已经评论了
def compute_Levenshtein_distance(str1: String, str2: String): Int = {
if (str1.isEmpty) return str2.length
if (str2.isEmpty) return str1.length
val replace = compute_Levenshtein_distance(str1.substring(1), str2.substring(1)) + NumOfReplacement(str1.charAt(0), str2.charAt(0))
val insert = compute_Levenshtein_distance(str1, str2.substring(1)) + 1
val delete = compute_Levenshtein_distance(str1.substring(1), str2) + 1
minm_edits(replace.toInt, insert.toInt, delete.toInt) // **Error1:- return type expected is INt but found Any**
}
def NumOfReplacement(c1: Char, c2: Char) = {
if (c1 == c2) 0
else 1
}
def minm_edits(nums: Int*) = {
Arrays.stream(nums).min.orElse(Integer.MAX_VALUE) // **Error2:- Cannot resolve overloaded method 'Stream'**
}
def main(args: Array[String]) = {
val s1 = "glomax"
val s2 = "folmax"
System.out.println(compute_Levenshtein_distance(s1, s2))
}
因为我在 scala 中处于非常初级的水平...我不明白我该如何解决它。
有人可以帮我解决这个问题吗?
出现错误 #2 的原因是您试图将 Scala Seq[Int]
传递给 java 标准库 Array.streams
函数,该函数不接受 Scala 集合。
因此,minm_edits
的 return 类型不会被推断为 Int
,因此错误 #1 告诉您尽管您声明了 return compute_Levenshtein_distance
类型为 int,Scala 编译器无法判断 minm_edits
return 是一个 int。
通过修复 minm_edits
(使用 scala 标准库而不是 Java 库)这两个错误都会消失。
def minm_edits(nums: Int*) = {
nums.minOption.getOrElse(Integer.MAX_VALUE)
}