У меня есть приложение Scala со списком элементов с флажками, чтобы пользователь выбрал некоторые, и нажмите кнопку, чтобы переместить их на одну позицию вверх (слева). Я решил написать функцию для перемещения элементов некоторого произвольного типа, которые удовлетворяют заданному предикату. Итак, если у вас есть эти элементы:
a b c D E f g h I
а предикат - "символы верхнего регистра", функция вернет это:
a b D E c f g I h
Короче говоря, любая последовательность смежных элементов, которые соответствуют предикату, обменивается одним элементом слева от него.
Я придумал следующую уродливую императивную реализацию. Я хотел бы видеть приятное и, надеюсь, читаемое функциональное решение.
def shiftUp[T](a:Array[T], shiftable: T => Boolean) = {
val s = new Array[T](a.length)
var i = 0
var j = 0
while(i < a.length)
{
if(!shiftable(a(i)) && i < a.length - 1 && shiftable(a(i+1)))
{
var ii = i + 1
while(ii < a.length && shiftable(a(ii)))
{
s(j) = a(ii)
ii = ii+1
j = j+1
}
s(j) = a(i)
i = ii
}
else
{
s(j) = a(i)
i = i+1
}
j = j+1
}
s
}
EDIT: Спасибо всем, надеюсь, вам понравилось упражнение!