Q
는
2
A
답변
3
이 span
사용 :
def magic[T](l: List[T]): List[List[T]] = {
@tailrec
def magicAux[T](l: List[T], r: MutableList[List[T]]): MutableList[List[T]] = {
val (p, s) = l.span(_ != "")
s match {
case Nil => r += p
case _ => magicAux(s.tail, r += p)
}
}
magicAux(l, new MutableList[List[T]]()).toList
}
+0
진 (Jean), 고맙지 만 수집 방법을 찾고 있는데, "더 좋은"방법이 있다고 생각합니까? – Omid
+0
@Omid "좋네"라고하면 표준 라이브러리에서 뭔가 의미가 있습니다. . 그리고 있다면, 그것은 이와 비슷한 방법 일 것입니다. –
1
어떻게 이것에 대해 하나
scala> Stream.iterate(""::data){ _.tail.dropWhile(_.nonEmpty) }
.takeWhile(_.nonEmpty)
.map{ _.tail.takeWhile(_.nonEmpty) }.toList
res1: List[List[String]] = List(List(a, b), List(c, d, e), List(a, b, c))
또는이 :
scala> (-1 +: data.zipWithIndex.collect{ case ("", i) => i } :+ data.size)
.sliding(2).toList
.map{ case List(h, t) => data.slice(h+1,t) }
res2: List[List[String]] = List(List(a, b), List(c, d, e), List(a, b, c))
그리고이 하나
scala> (data:+"").foldLeft(List[List[String]](), List[String]()){
case((xs, x), v) => if(v.isEmpty) (x.reverse::xs, Nil) else (xs,v::x)
}._1.reverse
res3: List[List[String]] = List(List(a, b), List(c, d, e), List(a, b, c))
0
는 foldRight
사용 :
val res = ("" :: data).foldRight(List[List[_]](Nil))((x, s) =>
(x, s) match {
case ("", Nil :: _) => s
case ("", _) => Nil :: s
case (x, h :: t) => (x :: h) :: t
}).tail
은 항상 조건과 일치하는 요소를 드롭 할 것인가? –
그것은 거의 이것의 중복입니다 : http://stackoverflow.com/questions/21800041/how-to-extend-a-scala-list-to-enable-slicing-not-by-explicit-position-but-by -giv/21803339 # 21803339 –
@Paul 메소드 요소를 삭제할 수 없다면 괜찮을 것입니다. 왜냐하면 출력 요소가 항상 head라는 것을 알기 때문입니다. – Omid