有沒有辦法拆分字串串列,如下所示:
List("lorem", "ipsum" ,"X", "sit", "amet", "consectetur")
在每個謂詞中,如x => x.equals("X")進入幾個串列,結果將是:
List(List("lorem", "ipsum"), List("sit", "amet", "consectetur"))
這一切都以簡單的功能方式?
uj5u.com熱心網友回復:
該unfold()(斯卡拉2.13.x)的方式。
val lst =
List("X","lorem","ipsum","X","sit","amet","X","consectetur","X")
List.unfold(lst){st =>
Option.when(st.nonEmpty){
val (nxt, rst) = st.span(_ != "X")
(nxt, rst.drop(1))
}
}
//res0: List[List[String]] = List(List()
// , List(lorem, ipsum)
// , List(sit, amet)
// , List(consectetur))
uj5u.com熱心網友回復:
您可以使用尾遞回函式輕松跟蹤每個塊,如下所示:
def splitEvery[A](data: List[A])(p: A => Boolean): List[List[A]] = {
@annotation.tailrec
def loop(remaining: List[A], currentChunk: List[A], acc: List[List[A]]): List[List[A]] =
remaining match {
case a :: tail =>
if (p(a))
loop(
remaining = tail,
currentChunk = List.empty,
currentChunk.reverse :: acc
)
else
loop(
remaining = tail,
a :: currentChunk,
acc
)
case Nil =>
(currentChunk.reverse :: acc).reverse
}
loop(
remaining = data,
currentChunk = List.empty,
acc = List.empty
)
}
可以這樣使用:
val data = List("lorem", "ipsum" ,"X", "sit", "amet", "consectetur")
val result = splitEvery(data)(_ == "X")
// result: List[List[String]] = List(List(lorem, ipsum), List(sit, amet, consectetur)
)
您可以在此處看到運行的代碼。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/372770.html
