计算可在列表中转换为Int的字符串数

时间:2017-02-15 01:22:51

标签: scala

例如,我的输入是:

scala> val myList = List("7842", "abf45", "abd", "56")
myList: List[String] = List(7842, abf45, abd, 56)

784256可以转换为Int;因此,我的预期输出为2。我们可以假设不会发生负整数,因此-67是不可能的。

这是我到目前为止所做的:

scala> myList.map(x => Try(x.toInt).getOrElse(-1)).count(_ > -1)
res15: Int = 2

这应该可以正常工作,但我觉得我错过了一个更优雅和可读的解决方案,因为我所要做的就是计算成功的次数。

4 个答案:

答案 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