Clojure技术问询:如何从ASCII地图数组中获取字符坐标
在Clojure中查找ASCII地图里指定字符的坐标
嘿,作为Clojure初学者遇到这个问题太正常了,咱们一步步来搞定它!你的需求是从字符串数组构成的ASCII地图里,找到某个字符的(行,列)坐标——看你例子里P对应(2,3),应该是用1-based的计数方式(行和列都从1开始算),那咱们就按这个逻辑来实现。
核心解决方案
先直接给你能用的函数,之后再拆解细节帮你理解:
(defn find-char-coords [map-array target-char] (for [[row-idx row-str] (map-indexed vector map-array) [col-idx char] (map-indexed vector row-str) :when (= char target-char)] [(inc row-idx) (inc col-idx)]))
函数细节拆解(适合初学者)
- 遍历行并记录索引:
(map-indexed vector map-array)会把地图数组里的每一行字符串和它的索引(从0开始)配对,比如你的地图数组会变成类似[[0 "+-----+"] [1 "|XPX X|"] ...]的结构。 - 遍历每行字符并记录列索引:嵌套的
(map-indexed vector row-str)会把当前行的每个字符和它的列索引(同样从0开始)配对,比如"|XPX X|"会变成[[0 \|] [1 \X] [2 \P] ...]。 - 过滤目标字符:
:when (= char target-char)只保留和目标字符完全匹配的项。 - 转成1-based坐标:
(inc row-idx)和(inc col-idx)把0起始的索引转换成你需要的1起始计数(如果习惯用0-based坐标,直接去掉inc就行)。
测试你的例子
把你的地图代入函数试试:
(def my-map ["+-----+" "|XPX X|" "|X X|" "|X XX|" "|X X|" "|XX DX|" "+-----+"]) ; 注意Clojure里字符字面量要加\,比如\P而不是"P" (find-char-coords my-map \P) ;; 输出:([2 3])
额外实用小技巧
- 如果地图里有多个相同字符,这个函数会返回所有匹配的坐标列表,比如查找
\X会得到一堆结果; - 如果你只需要第一个匹配的坐标,用
first包裹就行:(first (find-char-coords my-map \P)); - 别混淆字符和字符串:Clojure里
\P是字符类型,"P"是字符串类型,行字符串里的每个元素是字符,所以一定要用\开头的字符字面量来匹配。
内容的提问来源于stack exchange,提问作者David Furnam
相关产品推荐
相关产品推荐

