У меня есть приложение 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: Спасибо всем, надеюсь, вам понравилось упражнение!
Что вы хотите использовать? e, если выбор для переключения - 'A b C d'? – huynhjl
A C b d Те, которые достигают вершины, просто остаются там. –