2011-11-19 8 views
3

J'ai cette liste:Clojure: Déplacer un élément dans une liste

("a" "b" "c" "d" "e") 

Je veux passer « d » dans la première position:

("d" "a" "b" "c" "e") 

Y at-il moyen simple de le faire?

EDIT

Merci pour les réponses. J'ai eu un coup d'oeil dans et je l'ai fait:

(defn move-item [data item-to-move] 
    (conj (remove #(= % item-to-move) data) item-to-move)) 
(move-item ["a" "b" "c" "d" "e"] ["d"]) 

Je ne suis pas sûr que ce soit une bonne conception, mais il fait l'affaire.

+0

Dans ce cas, vous devez poster votre propre réponse et l'accepter. – 4e6

+0

(move-item ["a" "b" "c" "d" "e"] ["d"]); => (["d"] "a" "b" "c" "d" " e ") – BLUEPIXY

Répondre

1

Si vous n'avez pas besoin beaucoup de flexibilité, alors je vais trouver une solution déstructurant:

user=> (letfn [(des [{:strs [a b c d]}] [d a b c])] 
     (des (set ["a" "b" "c" "d"]))) 
["d" "a" "b" "c"] 
user=> 

L'utilisation set permet d'utiliser les éléments clés comme, qui peuvent être démontés et nommés en utilisant le :strs directif. Ensuite, vous venez de renvoyer les éléments dans l'ordre que vous voulez.

Je suppose qu'une macro devrait vous permettre de généraliser l'approche.

5

fonctions qui peuvent être utiles:
1. rotate

user=> (defn rotate [xs] (cons (last xs) (drop-last xs))) 
#'user/rotate 
user=> (rotate '(1 2 3)) 
(3 1 2) 

2. replace

user=> (replace {1 4} [1 2 3 4]) 
[4 2 3 4] 
0
(defn move-last [coll] 
    (cons (last coll) (drop-last coll))) 

user=>(move-last '("a" "b" "c" "d")) 
("d" "a" "b" "c") 
Questions connexes