Clojure: переместить элемент в список - PullRequest
3 голосов
/ 19 ноября 2011

У меня есть этот список:

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

Я хочу переместить "d" на первую позицию:

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

Есть ли какой-нибудь простой способ сделать это?

РЕДАКТИРОВАТЬ

Спасибо за ответы.Я посмотрел на это и сделал следующее:

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

Я не уверен, что это хороший дизайн, но он помогает.

Ответы [ 3 ]

5 голосов
/ 19 ноября 2011

функций, которые могут быть полезны:
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]
1 голос
/ 19 ноября 2011

Если вам не нужна большая гибкость, тогда я пойду на решение по деструктуризации:

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

Использование set позволяет использовать элементы в качестве ключей, которые можно разобрать и назватьиспользуя директиву :strs.Затем вы просто возвращаете элементы в нужном вам порядке.

Полагаю, макрос должен позволить вам обобщить подход.

0 голосов
/ 19 ноября 2011
(defn move-last [coll]
    (cons (last coll) (drop-last coll)))

user=>(move-last '("a" "b" "c" "d"))
("d" "a" "b" "c")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...