Ho un'app Scala con un elenco di elementi con caselle di controllo, quindi l'utente ne seleziona alcuni e fa clic su un pulsante per spostarli di una posizione in alto (a sinistra). Ho deciso di scrivere una funzione per spostare elementi di un tipo arbitrario che soddisfano un dato predicato. Quindi, se si dispone di questi elementi:Come sarebbe un approccio funzionale allo spostamento di determinati elementi dell'array?
a b c D E f g h I
e il predicato è "caratteri maiuscoli", la funzione potrebbe restituire questo:
a b D E c f g I h
In breve, qualsiasi sequenza di elementi contigui che soddisfano il predicato sono scambiato con il singolo elemento a sinistra di esso.
Mi è venuta la seguente brutta implementazione imperativa. Mi piacerebbe vedere una soluzione funzionale, e, si spera, leggibile.
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: Grazie a tutti, spero che vi sia piaciuto l'esercizio!
Cosa vuoi vedere? e succede se la selezione da spostare è 'A b C d'? – huynhjl
A C b d Quelli che raggiungono il "top" rimangono semplicemente lì. –