2016-04-28 2 views
-1

С помощью ["a" "b" "r" "d" "r"], как заменить элементы по индексам 2 и 4 на значение " отметьте ", чтобы [" a "" b "" mark "" d "" mark "] был результатом. Значения замещений кандидатов неизвестны, только индексы известны.Как заменить несколько элементов вектора на основе списка индексов

Попытка использования map со списком (2 4) результаты в нескольких векторах. assoc также не работает для экземпляра, где есть несколько индексов.

+2

Это выглядит как домашнее задание. что ты уже испробовал? – schaueho

ответ

3

просто ассоциативный новый элемент в соответствующих индексов:

(assoc ["a" "b" "r" "d" "r"] 2 "mark" 4 "mark") 

или сделать его более устойчивым:

(apply assoc ["a" "b" "r" "d" "r"] (interleave [2 4] (repeat "mark"))) 

или уменьшить:

(reduce #(assoc %1 %2 "mark") 
     ["a" "b" "r" "d" "r"] 
     [2 4]) 
+0

Решение с 'apply assoc' является кратким и удобочитаемым. Спасибо. –

1

Определение функции:

(defn replace-indexed [smap coll] 
    (map-indexed (fn [i e] (get smap i e)) coll)) 

Использование:

user> (replace-indexed {2 "mark" 4 "mark"} ["a" "b" "r" "d" "r"]) 
;; => ("a" "b" "mark" "d" "mark") 

Результат представляет собой последовательность, а не вектор.

+0

Очень ценится. Я попытался сопоставить обновление с заменой безуспешно. –

Смежные вопросы