복붙노트

[SCALA] 어떻게 술어에 의해 두 부분으로 순서를 분할하려면?

SCALA

어떻게 술어에 의해 두 부분으로 순서를 분할하려면?

어떻게 술어에 의해 두 개의 목록으로 순서를 분할합니까?

대안 : 나는 필터와 filterNot를 사용하거나 내 자신의 방법을 쓸 수 있지만 더 나은 더 일반적인 (내장) 방법이 없을 수 있습니까?

해결법

  1. ==============================

    1.파티션 방법을 사용하여 :

    파티션 방법을 사용하여 :

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

    2.범위 : - 파티션이 당신이 원하는 것은이었다 좋은 또한 두 가지의 목록을 분할하는 술어를 사용하는 다른 방법이있다.

    범위 : - 파티션이 당신이 원하는 것은이었다 좋은 또한 두 가지의 목록을 분할하는 술어를 사용하는 다른 방법이있다.

    첫 번째 파티션은 두 번째 목록에 한 목록에있는 모든 "true"를 요소 및 다른 사람을 넣어 것입니다.

    요소가 (술어의 관점에서) "거짓"이 될 때까지 범위가 하나 개의 목록에있는 모든 요소를 ​​넣어 것입니다. 그 시점 앞으로에서, 그것은 두 번째 목록의 요소를 넣어 것입니다.

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

    3.당신은 scalex.org를 살펴 할 수 있습니다 - 당신이 자신의 서명으로 기능에 대한 스칼라 표준 라이브러리를 검색 할 수 있습니다. 예를 들어, 다음을 입력합니다 :

    당신은 scalex.org를 살펴 할 수 있습니다 - 당신이 자신의 서명으로 기능에 대한 스칼라 표준 라이브러리를 검색 할 수 있습니다. 예를 들어, 다음을 입력합니다 :

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

    당신은 파티션을 볼 것입니다.

  4. ==============================

    4.당신이 뭔가 조금 여분을해야하는 경우도 foldLeft을 사용할 수 있습니다. 파티션을 절단하지 않았을 때 난 그냥이 같은 일부 코드를 작성 :

    당신이 뭔가 조금 여분을해야하는 경우도 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)
        }
      }
    
  5. ==============================

    5.당신이 2 개 이상의 조각으로 목록을 분할하고 경계를 무시하려는 경우, 당신은이 같은 (당신의 int를 검색해야하는 경우 수정)을 사용할 수 있습니다

    당신이 2 개 이상의 조각으로 목록을 분할하고 경계를 무시하려는 경우, 당신은이 같은 (당신의 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"})
    
  6. from https://stackoverflow.com/questions/12148581/how-to-split-a-sequence-into-two-pieces-by-predicate by cc-by-sa and MIT license