使用dropWhile根据条件累积列表

时间:2018-07-16 15:53:13

标签: scala

val list = List("1","10","12","30","40","50")

基于此处n中的参数"12""12"前面的元素应形成一个     列表List("30,40,50"),最终列表应如下创建

预期产量   List("1","10","12",List("30,40,50") )

list.dropWhile(_!="12").tail gives `List("30,40,50")` but i am not above the achieve the desired output

3 个答案:

答案 0 :(得分:2)

partition将提供最接近您想要的输出。

scala> list.partition(_ <= "12")
res21: (List[String], List[String]) = (List(1, 10, 12),List(30, 40, 50))

List的所有元素必须具有相同的类型。 splitAtpartition可以完成此操作,尽管返回类型与所需的返回类型不同。我怀疑期望的返回类型List[String, ..., List[String]]是“类型气味”,可能表示另一个问题。

答案 1 :(得分:2)

也许span可以帮助您

val (a, b) = list.span(_ != "12")
val h :: t = b
val res = a :+ h :+ List(t.mkString(","))

为输入List("123", "10", "12", "30", "40", "50")生成:

List("123", "10", "12", List("30,40,50"))

答案 2 :(得分:0)

如果处理输出类型(List[java.io.Serializable]),则这里是acc方法,该方法采用所需的参数,在这种情况下为字符串s

 def acc(list:List[String],s:String) = {
       val i = list.indexOf(s)
       list.take(i+1):+List(list.drop(i+1).mkString(",")) 
    }

在Scala REPL中:

scala> val list = List("1","10","12","30","40","50")
list: List[String] = List(1, 10, 12, 30, 40, 50)
scala> acc(list,"12")
res29: List[java.io.Serializable] = List(1, 10, 12, List(30,40,50))

scala> acc(list,"10")
res30: List[java.io.Serializable] = List(1, 10, List(12,30,40,50))

scala> acc(list,"40")
res31: List[java.io.Serializable] = List(1, 10, 12, 30, 40, List(50))

scala> acc(list,"30")
res32: List[java.io.Serializable] = List(1, 10, 12, 30, List(40,50))