2015-01-05 3 views
2

이 같은 목록이 술어 splittor에 따라 다른 목록에 개체의 목록을 분할 스칼라가 되는가?

뭔가 같은 :

data.MAGIC(_=="") 
+0

은 항상 조건과 일치하는 요소를 드롭 할 것인가? –

+0

그것은 거의 이것의 중복입니다 : http://stackoverflow.com/questions/21800041/how-to-extend-a-scala-list-to-enable-slicing-not-by-explicit-position-but-by -giv/21803339 # 21803339 –

+0

@Paul 메소드 요소를 삭제할 수 없다면 괜찮을 것입니다. 왜냐하면 출력 요소가 항상 head라는 것을 알기 때문입니다. – Omid

답변

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