2012-08-27 5 views

Antwort

144

Durch die Verwendung von partition Methode:

scala> List(1,2,3,4).partition(x => x % 2 == 0) 
res0: (List[Int], List[Int]) = (List(2, 4),List(1, 3)) 
13

Sie vielleicht einen Blick auf scalex.org nehmen wollen - es erlaubt Ihnen, die scala-Standardbibliothek für Funktionen, die durch ihre Unterschrift zu suchen. Geben Sie beispielsweise die folgenden:

List[A] => (A => Boolean) => (List[A], List[A]) 

Sie Partition sehen würde.

+7

Die Domain von scalex.org ist derzeit nicht verfügbar. Aber es gibt eine Alternative - http://scala-search.org/ ;-). – monnef

118

Gut, dass partition das war, was Sie wollten - es gibt eine andere Methode, die auch ein Prädikat verwendet, um eine Liste in zwei zu teilen: span.

Die erste, partition wird alle "wahre" Elemente in eine Liste und die anderen in der zweiten Liste setzen.

span werden alle Elemente in eine Liste eingefügt, bis ein Element "falsch" (in Bezug auf das Prädikat) ist. Von diesem Punkt an werden die Elemente in die zweite Liste eingefügt.

scala> Seq(1,2,3,4).span(x => x % 2 == 0) 
res0: (Seq[Int], Seq[Int]) = (List(),List(1, 2, 3, 4)) 
+2

Genau das, was ich gesucht habe. Wenn die Liste nach einem verwandten Kriterium geordnet ist, ist dies viel sinnvoller. – erich2k8

11

Sie können auch foldLeft verwenden, wenn Sie etwas mehr brauchen. Ich schrieb einige Code wie diesen, wenn Partition es nicht geschnitten:

val list:List[Person] = /* get your list */ 
val (students,teachers) = 
    list.foldLeft(List.empty[Student],List.empty[Teacher]) { 
    case ((acc1, acc2), p) => p match { 
     case s:Student => (s :: acc1, acc2) 
     case t:Teacher => (acc1, t :: acc2) 
    } 
    } 
+1

Sehr schöne Möglichkeit, ein Tupel zu verwenden und foldLeft. Ich benutzte einen ListBuffer, um die zwei Listen in der gleichen Reihenfolge effizient zu halten, aber ansonsten war es genau richtig für das, was ich brauchte. –

0

Wenn Sie eine Liste in mehr als zwei Stücke geteilt werden soll, und die Grenzen ignorieren, Sie so etwas wie diese verwenden könnte (ändern, wenn Sie müssen nach Ints suchen)

def split(list_in: List[String], search: String): List[List[String]] = { 
    def split_helper(accum: List[List[String]], list_in2: List[String], search: String): List[List[String]] = { 
    val (h1, h2) = list_in2.span({x: String => x!= search}) 
    val new_accum = accum :+ h1 
    if (h2.contains(search)) { 
     return split_helper(new_accum, h2.drop(1), search) 
    } 
    else { 
    return accum 
    } 
    } 
    return split_helper(List(), list_in, search) 
} 

// TEST 

// split(List("a", "b", "c", "d", "c", "a"), {x: String => x != "x"}) 
Verwandte Themen