我有一个字符串1,3,5-10
,我必须将此字符串转换为scala中的整数列表。列表会像这样--- >>。 List(1,3,5,6,7,8,9,10)
如何使用flatMap
将字符串列表转换为整数列表的最佳方法。
或Scala中最少的代码行将执行此操作。
这里是要开始的地方:
import scala.util.Try
def validateRegex(input: String): Try[Unit] = Try(if(!input.matches("((\\d+-\\d+|\\d+)($|,(\\s+)?))+")) throw new Exception(""))
def validateRange(input: String): Try[Unit] = Try {
val pattern = "\\d+-\\d+".r
(pattern findAllIn input).toList.map(_.split("-").map(_.toInt)).map(_.toList).map {
case a :: b :: Nil if a >= b => throw new Exception("")
case _ =>
}
}
def validateInput(input: String): Boolean = {
val list: List[Try[Unit]] = List(
validateRegex(input),
validateRange(input)
)
!list.exists(_.isFailure)
}
def inToOut(input: String): List[Int] = {
if(validateInput(input)) input.split(",\\s?").flatMap {
case r if r.contains("-") =>
val s = r.split("-").map(_.toInt)
Range(s(0), s(1) + 1).toList
case i => List(i.toInt)
}.toList else List()
}
您用您的字符串调用inToOut
,它会弹出一个空列表(如果您的字符串无效),或者如果所有格式正确,则填充一个列表。
这不完整。
"1,3,5-10".split(",").toList.flatMap{case s"$a-$b"=>a.toInt to b.toInt;case a=>a.toInt::Nil}