从Scala字符串末尾删除字符

91
什么是在Scala中从字符串末尾删除最后一个字符的最简方法?
我发现Ruby的String类有一些非常有用的方法,比如chop。我本来会在Scala中使用"oddoneoutz".headOption,但它已被弃用。我不想涉及过于复杂的事情:
string.slice(0, string.length - 1)
请问有没有像“chop”一样简单易用的方法来处理这种常见情况?
6个回答

177

你可以尝试使用 dropRight 函数,它适用于 2.8 版本:

"abc!".dropRight(1)

这将产生 "abc"。


1
我能想出的最简洁的2.7代码是 "abc!".split(".$)(0) 。 - Don Mackenzie
3
抱歉,我的意思是 "abc!".split(".$")(0)。 - Don Mackenzie
非常感谢 Don,我需要升级到2.8版 :) - BefittingTheorem

13
string.init // padding for the minimum 15 characters

谢谢 Walter,这正是我认为 Scala 应该有的方法。再次感叹所有这些好用的方法都只在 2.8 版本以上可用,所以让我来升级 :) - BefittingTheorem

7
val str = "Hello world!"
str take (str.length - 1) mkString

+1,感谢@Daniel Spiewak;他让我知道了"str drop(str.length -4)"可以得到信用卡号的最后4位,正是我所需要的;-) - virtualeyes

5

如果您想要最有效的解决方案,只需使用以下方法:

str.substring(0, str.length - 1)

4
string.reverse.substring(1).reverse

这基本上就是切割字符串,对吧?如果你想要一个切割方法,为什么不写你自己的StringUtils库,并将其包含在你的项目中,直到你找到一个合适的、更通用的替代品呢?

嘿,看,它在commons中。

Apache Commons StringUtils


3
当然是的,Stefan。我希望有一种方法,当你查看代码时,你能够理解正在发生的事情 :) 我的意思是:对于像“从字符串中删除最后一个字符”这样简单的东西,reverse.substring(1).reverse 是具有误导性的。谢谢回复。 - BefittingTheorem
而且你需要把字符串包装成一个 StringBuilder 才能得到一个反转方法。 - Fabian Steeg
2
第一部分大多是一个玩笑:P。任何查看你的Scala代码的Java程序员应该熟悉StringUtils,或者至少知道Apache Commons库以看到导入并不会感到冒犯。Commons很有用,应该在可能的情况下使用它。我发现大多数项目在某个时候都包括commons,因此使用该库通常没有额外费用。您甚至可以将StringUtils别名为su,在Scala程序中引用它为su.chop(str),这非常简洁,而且不像使用substring那么糟糕。 - Stefan Kendall
太遗憾了,如果StringUtils要隐式转换将会很麻烦。这正显示了Scala用户和Java用户思考扩展方法的方式之间的不匹配。 - Ken Bloom
import org.apache.commons.blah.{StringUtils => su} 是很多工作吗?理想情况下,您应该部署到已经建立了这些库的环境中,正如我所说的那样。 - Stefan Kendall
我认为Ken的意思是希望在Scala中,任何字符串实例都可以隐式地使用StringUtils方法。 - Nicolas

2

如果你只想删除最后一个字符,可以使用.dropRight(1)。或者,如果你想删除特定的结尾字符,你可能需要使用匹配模式,如

val s: String = "hello!"
val sClean: String = s.takeRight(1) match {
    case "!" => s.dropRight(1)
    case _   => s
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接