List 如何在Scala中将字符串转换为整数列表

List 如何在Scala中将字符串转换为整数列表,list,scala,flatmap,List,Scala,Flatmap,我有一个字符串1,3,5-10,我必须将这个字符串转换成scala中的整数列表。 列表将如下所示-->>列表(1,3,5,6,7,8,9,10) 如何使用flatMap将字符串列表转换为整数列表是最好的方法 或者Scala中的最小代码行将如何实现这一点 这是我试图实现的代码,但我希望有更好的方法来实现 val selectedNumberList: mutable.MutableList[Int] = mutable.MutableList[Int]() val numbersList = "1

我有一个字符串
1,3,5-10
,我必须将这个字符串转换成scala中的整数列表。 列表将如下所示-->><代码>列表(1,3,5,6,7,8,9,10)

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

或者Scala中的最小代码行将如何实现这一点

这是我试图实现的代码,但我希望有更好的方法来实现

val selectedNumberList: mutable.MutableList[Int] = mutable.MutableList[Int]()
val numbersList = "1,3,5-10".split(",").toList
for(i <- 0 until numbersList.size ){
if(numbersList(i).contains("-")){
val splitNumberToList = numbersList(i).split("-").toList
    for(j <- splitNumberToList.head.toInt to splitNumberToList.last.toInt){
      selectedNumberList += j
    }
}else{
    selectedNumberList += numbersList(i).toInt
  }
}
val selectedNumberList:mutable.MutableList[Int]=mutable.MutableList[Int]()
val numbersList=“1,3,5-10”。拆分(“,”)。toList

对于(i,这里是Scala 2.13的最短代码行,用于输入样本,使用
flatMap
生成预期输出:

scala> "1,3,5-10".split(',')
                 .toList
                 .flatMap{case s"$a-$b" => a.toInt to b.toInt;
                          case a        => a.toInt::Nil}
res0: List[Int] = List(1, 3, 5, 6, 7, 8, 9, 10)
注意:对于错误处理(如果需要),您可以捕获异常或使用
Try
在引擎盖下执行此操作


p.p.S.代码被格式化为一行,以便于计算其长度

导入scala.util.Try
def validateRegex(输入:字符串):Try[Unit]=Try(如果(!input.matches((\\d+-\\d+\\d+\\d+)($),(\\s+)+)抛出新异常(“”)
def validateRange(输入:字符串):Try[Unit]=Try{
val pattern=“\\d+-\\d+”。r
(模式findAllIn输入).toList.map(u.split(“-”).map(u.toInt)).map(u.toList.map{
如果a>=b=>抛出新异常(“”),则案例a::b::Nil
案例=>
}
}
def validateInput(输入:字符串):布尔={
val list:list[尝试[单位]]=list(
validateRegex(输入),
验证语言(输入)
)
!list.exists(u.isFailure)
}
def输入输出(输入:字符串):列表[Int]={
if(validateInput(input))input.split(“,\\s?”).flatMap{
如果r.contains(“-”)=>
val s=r.split(“-”).map(uu.toInt)
(第(0)至(1)条)托利斯
案例i=>列表(i.toInt)
}.toList-else列表()
}
使用字符串调用
intout
,如果字符串无效,则会弹出一个空列表;如果所有内容的格式都正确,则会弹出一个填充列表

然而 这是不完整的

  • 这不是很简洁-您可以大大缩短它,但这段代码的布局方式(希望)是可以理解的
  • 您需要添加更多(或不同)的错误处理-您的问题没有指定任何类型的错误处理,因此我实施了一些验证,您可以这样做,但您需要确定函数的限制(字符串格式、范围规则、顺序、重复值等)
  • 可能有一种更快的实现方法,可以在每次出现问题时不抛出异常。这取决于您的实现;我将由您决定
  • 我还没有解释负数(如果你需要的话,同样需要你去实现)


无论如何,这里有一个它的实现,其中有一些成功和失败的例子:

我已经尝试过这段代码,现在它对我来说运行良好

val numbers = "1,3,5-10".split(",").toList.flatMap{
  case x if x.contains("-") =>
    val k = x.split("-")
    k.head.toInt to k(1).toInt
  case a => a.toInt::Nil
}

到目前为止,您尝试了什么?您希望得到什么样的输入。您将如何处理错误?另外,请展示您的努力,这不是免费的代码服务。是否有必要使用
flatMap
?要求不完整。例如,可能有多个范围,负数吗?@Jatin您可能最终会使用flatMap anyway、 但是必须使用flatMap有点奇怪。这不是很安全;如果输入字符串不可靠,它不会处理任何错误情况。@JamesWhiteley除了
Try
,负数和非数字字符都可以通过添加额外的
case
s来处理。我建议编辑此答案并将样式更改为通常的Scala样式以提高可读性。是的,这很好,只需定义一个默认大小写,它将处理其他随机字符串。@Hackaholic,我的意思是遵守基本的可读性准则,例如使答案更易于访问。与@Andriyplokhotnuk的答案非常相似,但没有那么简洁明了。是的,它是类似的但我不得不修改代码,因为它在我的系统上出现了“类型不匹配”的错误可能您有一些早期版本的ScalaI已经将scala版本更改为2.13.0,但是,错误仍然存在,因此我必须修改它。它应该与scala 2.13.0配合使用,下面是我的REPL中的欢迎字符串:
欢迎使用scala 2.13.0(OpenJDK 64位服务器虚拟机,Java 1.8.0_232)。