Clojure将文件读入2D矢量

时间:2016-04-16 16:56:07

标签: file clojure

我有一个包含这样内容的简单文本文件

############
#P.........#
#..........#
#..........#
#..........#
#..........#
############

我希望能够将此信息加载到2D矢量中,因此我可以使用x / y坐标索引切片

我试过

(defn read-in-board [filepath]
  (str/split-lines (slurp filepath)))

打印结果然后输出以下内容

[############ #P.........# #..........# #..........# #..........# #..........# ############]       

我想知道如何将每个字符串中的字符转换为单个矢量

即。第1行

[[#][#][#][#][#][#][#][#][#][#][#][#].... Line 2                                                                            

1 个答案:

答案 0 :(得分:4)

我不知道您当前的解决方案有什么问题。如果我的temp.txt文件包含您在问题中提供的内容,我可以使用您的read-in-board函数阅读该文件,并使用get-in按其坐标访问任何字符:

(let [board (read-in-board "temp.txt")]
  (str (get-in board [1 1])))
;=> "P"

如果你真的需要一个2D矢量字符,你可以得到一个这样的:

(mapv vec (read-in-board "temp.txt"))
;=> [[\# \# \# \# \# \# \# \# \# \# \# \#]
;    [\# \P \. \. \. \. \. \. \. \. \. \#]
;    [\# \. \. \. \. \. \. \. \. \. \. \#]
;    [\# \. \. \. \. \. \. \. \. \. \. \#]
;    [\# \. \. \. \. \. \. \. \. \. \. \#]
;    [\# \. \. \. \. \. \. \. \. \. \. \#]
;    [\# \# \# \# \# \# \# \# \# \# \# \#]]

由于字符串是序列,vec将字符串转换为字符向量。因此,您可以使用mapv将该函数应用于电路板的每个元素,并返回一个矢量。

这将允许您使用assoc-inupdate-in,正如Piotrek Bzdyl指出的那样。