Clojure新手求助:如何提取嵌套向量元素并打印客户姓名
解决Clojure中提取并打印客户姓名的问题
嘿,作为Clojure新手碰到集合操作的问题太正常了,我帮你拆解下代码里的问题,再给出能正常运行的修正方案:
你的代码里的几个关键问题:
- 原始数据格式错误:你的
data字符串里多个客户信息是连在一起的,没有换行符,str/split-lines根本没法把它们拆分成单独的行。 - 变量名不匹配:你定义了
line-vecs-1,但后面遍历用的是line-vector-c——这个变量根本没定义,直接会抛出未绑定变量的异常。 - 缺少命名空间引入:
str/split-lines和str/split属于clojure.string命名空间,你得提前引入它,不然会找不到这些函数。 - 遍历与打印逻辑问题:
for是用来生成新序列的,直接在里面用print不会按预期执行;而且你访问向量元素的方式也不对,正确的向量元素访问应该用nth或者解构。
修正后的可运行代码
;; 先引入clojure.string命名空间,取别名str方便使用 (require '[clojure.string :as str]) ;; 修正data格式,用换行符分隔每个客户的信息 (def data "1|John Smith|123 Here Street|456-4567 2|Sue Jones|43 Rose Court Street|345-7867 3|Fan Yuhong|165 Happy Lane|345-4533") (defn test-print-names [] (let [;; 把data按行分割成独立的字符串序列 lines (str/split-lines data) ;; 把每一行按|分割成向量,得到一个"向量的向量" customer-vecs (mapv #(str/split % #"\|") lines)] ;; 用doseq执行打印的副作用操作,遍历每个客户向量 (doseq [customer customer-vecs] ;; 向量索引从0开始,姓名是第2个元素(索引1) (println (nth customer 1))))) ;; 调用函数测试 (test-print-names)
额外优化:用解构提升可读性
你还可以用解构的方式直接提取姓名,让代码更直观:
(doseq [[_ name _ _] customer-vecs] (println name))
这里[_ name _ _]解构了每个客户向量,忽略第1、3、4个元素,直接把第2个元素绑定到name变量上,不用再手动记索引啦。
内容的提问来源于stack exchange,提问作者Mike J
相关产品推荐
相关产品推荐

