为什么我的 clojure 循环返回单个字母而不是整个单词?

C__*_*C__ 0 loops clojure

我正在尝试循环一组字符串,删除多余的文本。它有效,但太好了。给定这样的输入:

#{"TORCASO,133114,117,0.04,89045.38,99.00,0.00,0.00,0.00,0.00,0.00" "POTOCZNY,98770,170,0.06,87231.39,98.82,0.00,(S),0.00,0.00,(S)"}
Run Code Online (Sandbox Code Playgroud)

我的输出如下所示:

#{\A \C \N \O \P \R \S \T \Y \Z}
Run Code Online (Sandbox Code Playgroud)

但我希望它看起来像这样:

#{"TORCASO" "POTOCZNY"}
Run Code Online (Sandbox Code Playgroud)

这是我的代码:

(defn shorten-string
  [string]
  (first (str/split string #",")))


(defn handle-csv
  [strings]
  (loop [remaining-strings strings final-set #{}]
   (if (empty? remaining-strings)
     final-set
     (let [[part & remaining] remaining-strings]
       (recur remaining
              (into final-set
                    (shorten-string part)))))))
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

Mar*_*ůda 5

使用loop / recurfor 循环应该是你最后的手段——通常有一些更好的函数。在这种情况下,您应该使用map

(def data #{"TORCASO,133114,117,0.04,89045.38,99.00,0.00,0.00,0.00,0.00,0.00" "POTOCZNY,98770,170,0.06,87231.39,98.82,0.00,(S),0.00,0.00,(S)"})

(defn shorten-string [string]
  (first (clojure.string/split string #",")))

(defn handle-csv [strings]
  (->> strings
       (map shorten-string)
       (into #{})))
Run Code Online (Sandbox Code Playgroud)

->>是线程最后宏)

例子:

(handle-csv data)
=> #{"TORCASO" "POTOCZNY"}
Run Code Online (Sandbox Code Playgroud)