2017-02-16 27 views
0

Надеюсь, этот вопрос может понравиться любителям функционального программирования. Могу ли я попросить способ перевести следующий фрагмент кода на чистую функциональную реализацию в Scala с хорошим балансом между читабельностью и скоростью выполнения?Функциональная версия типичного вложенного цикла while

Описание: для каждого элемента в последовательности создается подпоследовательность, содержащая элементы, которые поступают после текущих элементов (включая себя) с расстоянием, меньшим заданного порогового значения. После того, как порог пересечен, не нужно обработать оставшиеся элементы

def getGroupsOfElements(input : Seq[Element]) : Seq[Seq[Element]] = { 
    val maxDistance = 10 // put any number you may 
    var outerSequence = Seq.empty[Seq[Element]] 

    for (index <- 0 until input.length) { 
     var anotherIndex = index + 1 
     var distance = input(index) - input(anotherIndex) // let assume a separate function for computing the distance 
     var innerSequence = Seq(input(index)) 

     while (distance < maxDistance && anotherIndex < (input.length - 1)) { 
     innerSequence = innerSequence ++ Seq(input(anotherIndex)) 
     anotherIndex = anotherIndex + 1 
     distance = input(index) - input(anotherIndex) 
     } 

     outerSequence = outerSequence ++ Seq(innerSequence) 
    } 

    outerSequence 
    } 
+1

«Лучший» довольно субъективен. По какому стандарту? Читаемость? Скорость? Использование памяти? – Carcigenicate

+0

спасибо, хорошая точка! – BlueSky

+2

Приведенный выше код будет вызывать исключение ArrayIndexOutOfBoundsException, когда индекс вводится.length-1. –

ответ

3

Вы знаете, это было бы тонну легче, если вы добавили описание того, что вы пытаетесь достичь вместе с кодом.

В любом случае, вот что-то, что может приблизиться к тому, что вы хотите.

def getGroupsOfElements(input: Seq[Element]): Seq[Seq[Element]] = 
    input.tails.map(x => x.takeWhile(y => distance(x.head,y) < maxDistance)).toSeq