如何在Scala中将字符串转换为Integer列表

问题描述 投票:0回答:2

我有一个字符串1,3,5-10,我必须将此字符串转换为scala中的整数列表。列表会像这样--- >>。 List(1,3,5,6,7,8,9,10)

如何使用flatMap将字符串列表转换为整数列表的最佳方法。

Scala中最少的代码行将执行此操作。

list scala flatmap
2个回答
0
投票

这里是要开始的地方:

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,它会弹出一个空列表(如果您的字符串无效),或者如果所有格式正确,则填充一个列表。

但是

这不完整。

  • 这不是很紧凑-您可以将其缩短很多,但是此代码的布局(希望是可以理解的。)>
  • 您将需要添加更多(或不同的)错误处理-您的问题没有指定任何类型的错误处理,因此我已经实施了一些验证,您可以[进行验证但是您需要确定函数的限制(字符串格式,范围规则,顺序,重复值等)。可能有一种更快的方法来实现此功能,而不会在每次出现问题时都引发异常。取决于您的实现;我把这个留给你。
  • 我没有考虑负数(如果需要的话,同样可以让您实现)。>>

  • 无论如何,这是它的实现,并带有一些成功和失败的示例:https://scastie.scala-lang.org/MYqKy9AgT52rlm7DhV3tKg

这是Scala 2.13的最短代码行:

"1,3,5-10".split(",").toList.flatMap{case s"$a-$b"=>a.toInt to b.toInt;case a=>a.toInt::Nil}


0
投票
这是Scala 2.13的最短代码行:
© www.soinside.com 2019 - 2024. All rights reserved.