2012-08-27 9 views

Respuesta

144

Mediante el uso de partition método:

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

Es posible que desee echar un vistazo a scalex.org - Permite realizar búsquedas en la biblioteca estándar Scala de funciones mediante su firma. Por ejemplo, escriba lo siguiente:

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

Veríais partición.

+7

scalex.org domain is currently dead. Pero hay una alternativa: http://scala-search.org/ ;-). – monnef

118

Bueno, partition era lo que quería, hay otro método que también usa un predicado para dividir una lista en dos: span.

El primero, partition pondrá todos los elementos "verdaderos" en una lista, y los otros en la segunda lista.

span pondrá todos los elementos en una lista hasta que un elemento sea "falso" (en términos del predicado). A partir de ese momento, colocará los elementos en la segunda lista.

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

Exactamente lo que estaba buscando. Cuando la lista está ordenada por un criterio relacionado, esto tiene mucho más sentido. – erich2k8

11

También puede usar foldLeft si necesita algo más. Acabo de escribir un código como éste cuando la partición no lo consiguió:

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

Muy buena forma de usar una tupla y foldLeft. Terminé usando un ListBuffer para mantener de manera eficiente las dos listas en el mismo orden, pero de lo contrario era el lugar perfecto para lo que necesitaba. –

0

Si desea dividir una lista en más de 2 piezas, y hacer caso omiso de los límites, se puede usar algo como esto (modificar si necesita buscar ints)

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"}) 
Cuestiones relacionadas