Jak podzielić sekwencję na dwie listy według predykatu?
Alternatywa: mogę użyć filter
i filterNot
lub napisać własną metodę, ale czy nie ma lepszej, bardziej ogólnej (wbudowanej) metody?
Przy użyciu partition
metody:
scala> List(1,2,3,4).partition(x => x % 2 == 0)
res0: (List[Int], List[Int]) = (List(2, 4),List(1, 3))
val (even, odd) = List(1,2,3,4).partition(x => x % 2 == 0)
jest sposobem na zniszczenie powstałej krotkipartition
w czytelny sposób._ % 2 == 0
.Dobrze, że
partition
było rzeczą, którą chciał - nie ma innej metody, które również wykorzystuje predykatu podzielić listę na dwie części:span
.Pierwsza z nich, partycja , umieści wszystkie „prawdziwe” elementy na jednej liście, a pozostałe na drugiej liście.
span umieści wszystkie elementy na jednej liście, dopóki element nie będzie „fałszywy” (w sensie predykatu). Od tego momentu elementy zostaną umieszczone na drugiej liście.
źródło
Możesz rzucić okiem na scalex.org - umożliwia ona przeszukiwanie standardowej biblioteki scala w poszukiwaniu funkcji według ich podpisu. Na przykład wpisz:
Zobaczysz partycję .
źródło
Możesz także użyć foldLeft, jeśli potrzebujesz czegoś dodatkowego. Właśnie napisałem taki kod, gdy partycja go nie przecięła:
źródło
Wiem, że mogę się spóźnić na przyjęcie i są bardziej szczegółowe odpowiedzi, ale możesz zrobić dobry użytek z tego
groupBy
To sprawia, że twój kod jest nieco bardziej przyszłościowy, jeśli chcesz zmienić warunek na coś innego niż logiczne.
źródło
Jeśli chcesz podzielić listę na więcej niż 2 części i zignorować granice, możesz użyć czegoś takiego (zmodyfikuj, jeśli chcesz szukać int)
źródło