如何在Clojure中的特定索引处更新2D向量的值?

时间:2019-05-28 03:21:59

标签: arrays clojure

我正在解决寻宝问题,并且想更改我的矢量数据值。那么,我该怎么做?

我尝试了很多事情,但对我没有任何帮助。我尝试了assoc,update,assoc-in,update-in等等。

(println (update-in data [row col] "+"))

(def data1 (-> data (assoc-in [0 0] \+)))

(println data1)

所以,我的载体就是这样

["---#--###----" 
 "---#---#-#---" 
 "-#-####---##-" 
 "-#------#----" 
 "-############" 
 "------------@"]

我想用-来更改+

2 个答案:

答案 0 :(得分:0)

字符串和向量在Clojure中是不可变的,因此您只能创建具有更新内容的对象的副本。

此外,您只能在Clojure的内置数据结构上调用assocupdate。您需要先将String转换为向量。更新后,可以通过在其上调用(apply str ...)将其转换回字符串。

(defn to-plus [data x y]
  (update data y (fn [row] (apply str (assoc (vec row) x \+)))))

答案 1 :(得分:0)

您将不得不优化数据结构,以便assoc-in可以使用它。 assoc-inupdate-in之类的函数在嵌套键值数据结构(例如地图和矢量)上运行。我建议像下面这样的摄取功能:

(defn create-maze [m]
  (into [] (map vec) m))

这为您提供了向量的向量,其性质类似于二维数组。然后,您可以提供一个辅助功能,将迷宫打印到屏幕上:

(defn print-maze [m]
  (doseq [line m]
    (->> line (apply str) println)))

现在您有了从字符串表示形式来回移动的方法,现在可以在中间形式上使用assoc-in来创建内容已更改的迷宫:

(->
  (create-maze data)
  (assoc-in [0 0] \+)
  (assoc-in [3 4] \+)
  print-maze)