Scala中是否有一种惯用的,功能性的方式来比较两个点缀版本的字符串,它们的长度可能不同?
例如:
1.0 == 1.0.0
1.2.4 > 1.2
1.10 > 1.2
Run Code Online (Sandbox Code Playgroud)
(Java解决方案通常是非常必要的样式)。
假设已经获得了版本字符串,那么它们仅包含以点分隔的整数(即“ 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)
有点类似,但没有递归:
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是重复的,因为链接的问题中接受的答案也很好地回答了这个问题。