在Scala中以功能方式比较两个版本?

DNA*_*DNA 5 scala

Scala中是否有一种惯用的,功能性的方式来比较两个点缀版本的字符串,它们的长度可能不同?

例如:

1.0 == 1.0.0
1.2.4 > 1.2
1.10 > 1.2
Run Code Online (Sandbox Code Playgroud)

Java解决方案通常是非常必要的样式)。

DNA*_*DNA 7

假设已经获得了版本字符串,那么它们仅包含以点分隔的整数(即“ 1.2.3”而不是“ 1.2.3-foo-beta-1234-etc”),这可以通过在“。”上拆分,压缩来实现将两个数字序列组合在一起(使用将零有效位置零填充zipAll),然后依次递归处理该对。

一旦找到一个与其他字符串中的对应数字不同的数字,我们便有了答案。但是如果数字相同,我们会进一步寻找。

  def versionComp(a: String, b: String) = {
    def nums(s: String) = s.split("\\.").map(_.toInt) 
    val pairs = nums(a).zipAll(nums(b), 0, 0).toList
    def go(ps: List[(Int, Int)]): Int = ps match {
      case Nil => 0
      case (a, b) :: t => 
        if (a > b) 1 else if (a < b) -1 else go(t)
    }
    go(pairs)
  }
Run Code Online (Sandbox Code Playgroud)

例子:

  versionComp("2", "1.1")                     //>  1
  versionComp("1.2", "1.1")                   //>  1
  versionComp("1.2", "1.1.5")                 //>  1
  versionComp("1.2.0", "1.1")                 //>  1
  versionComp("1.2.0.1", "1.2.0.0")           //>  1

  versionComp("1.2.3", "1.2.3")               //>  0
  versionComp("1.2.0", "1.2")                 //>  0
  versionComp("1.2.0.0", "1.2")               //>  0

  versionComp("1.2", "1.5")                   //>  -1
  versionComp("1.2.0", "1.20")                //>  -1
  versionComp("2.20.345", "3.1")              //>  -1
Run Code Online (Sandbox Code Playgroud)


Dim*_*ima 7

有点类似,但没有递归:

 version1.split("\\.")
   .zipAll(version2.split("\\."), "0", "0")
   .find {case(a, b) => a != b }
   .fold(0) { case (a, b) => a.toInt - b.toInt }
Run Code Online (Sandbox Code Playgroud)

另外,我认为FWIW是重复的,因为链接的问题中接受的答案也很好地回答了这个问题。