5 ответов:
С помощью
partitionспособ:scala> List(1,2,3,4).partition(x => x % 2 == 0) res0: (List[Int], List[Int]) = (List(2, 4),List(1, 3))
хорошо, что
partitionчто ты хотел ... есть еще один метод, который также использует предикат для разбиения списка на два:span.первый, раздел поместит все "истинные" элементы в один список, а остальные во второй список.
span будет помещать все элементы в один список, пока элемент не будет "false" (в терминах предиката). С этого момента он будет помещать элементы во второй список.
scala> Seq(1,2,3,4).span(x => x % 2 == 0) res0: (Seq[Int], Seq[Int]) = (List(),List(1, 2, 3, 4))
вы можете взглянуть на scalex.org - позволяет искать функции в стандартной библиотеке scala по их сигнатуре. Например, введите следующее:
List[A] => (A => Boolean) => (List[A], List[A])вы увидите раздел.
вы также можете использовать foldLeft, если вам нужно что-то немного больше. Я просто написал такой код, когда раздел не вырезал его:
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) } }
Если вы хотите разделить список на более чем 2 части и игнорировать границы, вы можете использовать что-то вроде этого (изменить, если вам нужно искать 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"})
Comments