Scala字符串比较不符合预期:如何让vc100_60判定为大于vc75_60?
解决Scala字符串数值比较的问题
这个问题我之前也碰到过!核心原因是你用了字符串默认的字典序比较,而不是你需要的数值大小比较,所以才会出现和预期不符的结果。
为什么会出错?
当你直接执行if(str1 > str2)时,Scala会按照字符串的字典序逐字符比较ASCII值:
- str1是
"vc100_60",str2是"vc75_60" - 前两个字符
"vc"完全一致,第三个字符str1是'1'(ASCII码49),str2是'7'(ASCII码55) - 因为49 < 55,所以整个字符串
str1在字典序中被判定为小于str2,str1 > str2返回false,代码自然会输出vc75_60
修改方案:提取数值后比较
我们需要从字符串中提取出vc后面的数字部分,转换成整数再进行比较。这里可以写一个简单的辅助函数来处理:
// 提取字符串中vc后面到第一个下划线前的数字,转为整数 def extractVcNumber(s: String): Int = { s.split("_")(0).replace("vc", "").toInt } val str1 = "vc100_60" val str2 = "vc75_60" // 用提取后的数值比较,而不是直接比较字符串 if (extractVcNumber(str1) > extractVcNumber(str2)) { println(str1) } else { println(str2) }
这段代码运行后,会先把str1转换成100,str2转换成75,再比较100 > 75,结果为true,最终输出你预期的vc100_60。
额外提示
如果你的字符串格式可能有变化(比如数字位置不同、有其他字符),可以考虑用正则表达式来提取数字,这种方式更健壮:
def extractVcNumber(s: String): Int = { val pattern = "vc(\\d+)_.*".r pattern.findFirstMatchIn(s).map(_.group(1).toInt).getOrElse(0) }
内容的提问来源于stack exchange,提问作者Surender Raja
相关产品推荐
相关产品推荐

