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)
}