例如,我的输入是:
scala> val myList = List("7842", "abf45", "abd", "56")
myList: List[String] = List(7842, abf45, abd, 56)
7842
和56
可以转换为Int
;因此,我的预期输出为2
。我们可以假设不会发生负整数,因此-67
是不可能的。
这是我到目前为止所做的:
scala> myList.map(x => Try(x.toInt).getOrElse(-1)).count(_ > -1)
res15: Int = 2
这应该可以正常工作,但我觉得我错过了一个更优雅和可读的解决方案,因为我所要做的就是计算成功的次数。
答案 0 :(得分:9)
我会警告不要在控制流中使用异常处理(如Try
) - 它非常慢。
这是一个使用惯用Scala集合操作的解决方案,性能良好,不会计算负数:
scala> val myList = List("7842", "abf45", "abd", "56")
myList: List[String] = List(7842, abf45, abd, 56)
scala> myList.count(_.forall(_.isDigit))
res8: Int = 2
编辑:@immibis指出,这不会检测到超过Integer.MaxValue
的数字字符串。如果这是一个问题,我会建议采用以下方法之一:
import scala.util.Try
myList.count(x => Try(x.toInt).filter(_ >= 0).isSuccess)
或者,如果你想在处理这个边缘情况时保持我的第一个答案的表现:
import scala.util.Try
myList.count(x => x.forall(_.isDigit) && Try(x.toInt).filter(_ >= 0).isSuccess)
答案 1 :(得分:8)
这有点短:
myList.count(x => Try(x.toInt).isSuccess)
请注意,此解决方案将处理可通过.toInt
转换为整数的任何字符串,包括负数。
答案 2 :(得分:4)
您也可以考虑使用正则表达式string.matches
方法,只匹配正整数:
val myList = List("7842", "abf45", "abd", "-56")
// myList: List[String] = List(7842, abf45, abd, -56)
myList.count(_.matches("\\d+"))
// res18: Int = 1
如果需要计算负整数(并考虑可能的+/-符号):
myList.count(_.matches("[+-]?\\d+"))
// res17: Int = 2
答案 3 :(得分:0)
从Scala 2.13
开始并引入String::toIntOption
,我们可以计算应用"34"
("2s3"
的项目(toIntOption
/ Some(34)
) / None
)已定义(true/false
):
List("34", "abf45", "2s3", "56").count(_.toIntOption.isDefined) // 2