복붙노트

[SCALA] 이웃와 비교하여 목록 항목을 그룹화

SCALA

이웃와 비교하여 목록 항목을 그룹화

자신의 이웃 값을 기준으로 그룹으로 값 목록을 그룹화의 가장 우아한 방법은 무엇입니까?

I 가지고 더 넓은 문맥 라인들의리스트를 구비하고, 그 요구가 문단으로 그룹화한다. 나는 두 선 사이의 수직 차이가 임계 값보다 낮은 경우, 그들은 같은 단락에 있다고 말할 수 있어야합니다.

나는 다르게이 문제를 해결 결국,하지만 난 여기에 올바른 솔루션에 대해 궁금하네요.

case class Box(y: Int)
val list = List(Box(y=1), Box(y=2), Box(y=5))

def group(list: List[Box], threshold: Int): List[List[Box]] = ???

val grouped = group(list, 2)
> List(List(Box(y=1), Box(y=2)), List(Box(y=5)))

나는 GROUPBY () 살펴 보았다,하지만 한 번에 하나 개의 요소로 작업 할 수 있습니다. 또한 관여 미리 계산하여 차이) (슬라이딩한다는 방법을 시도했지만, 그것은 원래의 집합의 요소를 검색하는 어색하게된다.

해결법

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

    1.그것은 하나의 라이너입니다. 독자들에게 숙제로 남긴다 유형을 일반화.

    그것은 하나의 라이너입니다. 독자들에게 숙제로 남긴다 유형을 일반화.

    int 치의 절대 차이보다는 라인을 사용하고 혼란을 방지하기 위해 간격.

    val zs = List(1,2,4,8,9,10,15,16)  
    def closeEnough(a:Int, b:Int) = (Math.abs(b -a) <= 2)
    
    zs.drop(1).foldLeft(List(List(zs.head)))
                          ((acc, e)=> if (closeEnough(e, acc.head.head)) 
                                          (e::acc.head)::acc.tail
                                      else
                                           List(e)::acc)
           .map(_.reverse)
           .reverse
    
    // List(List(1, 2, 4), List(8, 9, 10), List(15, 16))
    

    또는 약간의 효율 증가를위한 두 라이너

    val ys = zs.reverse
    ys.drop(1).foldLeft(List(List(ys.head)))
                    ((acc, e)=> if (closeEnough(e, acc.head.head)) 
                       (e::acc.head)::acc.tail
                    else
                       List(e)::acc)
    // List(List(1, 2, 4), List(8, 9, 10), List(15, 16))
    
  2. from https://stackoverflow.com/questions/37816015/grouping-list-items-by-comparing-them-with-their-neighbors by cc-by-sa and MIT license