반응형
술어를 사용하여 시퀀스를 두 조각으로 나누는 방법은 무엇입니까?
술어에 의해 시퀀스를 두 개의 목록으로 나누는 방법은 무엇입니까?
대안 : 내가 사용 filter
하고 filterNot
, 또는 내 자신의 방법을 쓸 수 있지만 더 나은 더 일반적인 (내장) 방법이 없다?
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
.
첫 번째 파티션 은 모든 "true"요소를 하나의 목록에 배치하고 다른 요소는 두 번째 목록에 배치합니다.
span 은 요소가 "거짓"(조건 자 측면)이 될 때까지 모든 요소를 하나의 목록에 넣습니다. 그 시점부터는 요소를 두 번째 목록에 넣습니다.
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)
}
}
목록을 두 개 이상의 조각으로 나누고 범위를 무시하려면 다음과 같이 사용할 수 있습니다 (int를 검색 해야하는 경우 수정하십시오)
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"})
참고 URL : https://stackoverflow.com/questions/12148581/how-to-split-a-sequence-into-two-pieces-by-predicate
반응형
'IT story' 카테고리의 다른 글
텍스트 상자를 대문자로 자동 설정하는 방법 (0) | 2020.07.28 |
---|---|
문자열이 C ++의 숫자인지 확인하는 방법은 무엇입니까? (0) | 2020.07.28 |
MVC 웹 API : 요청 된 자원에 'Access-Control-Allow-Origin'헤더가 없습니다. (0) | 2020.07.28 |
내 Git 저장소가 잘못된 루트 디렉토리에 있습니다. (0) | 2020.07.28 |
일부 Git 저장소에서 Git 저장소의 이름을 어떻게 얻습니까? (0) | 2020.07.28 |