31

文字列をソースとして使用して、文字のリストを作成しようとしています。少しグーグルして何も思いつかなかったので、自分がやりたいことを実行する関数を作成しました。

(defn list-from-string [char-string]
  (loop [source char-string result ()]
    (def result-char (string/take 1 source))
    (cond
     (empty? source) result
     :else (recur (string/drop 1 source) (conj result result-char)))))

しかし、これを見ると、私はトリックを逃しているに違いないように感じます。

  1. 私のためにこれを行うコアまたは貢献関数はありますか?確かに私はただ馬鹿げているだけですか?
  2. そうでない場合、このコードを改善する方法はありますか?
  3. 同じことが数字にも当てはまりますか?
4

4 に答える 4

51

これを行うには、 seq関数を使用できます。

user=> (seq "aaa")
(\a \a \a)

数値については、次のような「ダム」ソリューションを使用できます。

user=> (map (fn [^Character c] (Character/digit c 10)) (str 12345))
(1 2 3 4 5)

clojure の PS 文字列は 'seq'able であるため、それらを任意のシーケンス処理関数 (map、for、...) のソースとして使用できます。

于 2011-01-29T12:36:16.107 に答える
23

入力が文字になることがわかっている場合は、そのまま使用してください

user=> (seq "abc")
(\a \b \c)

数字については、これを試してください

user=> (map #(Character/getNumericValue %) "123")
(1 2 3)
于 2011-01-29T14:04:32.167 に答える
6

編集:おっと、さまざまなキャラクターのリストが必要だと思いました。そのためには、コア機能「周波数」を使用します。

clojure.core/frequencies
([coll])
  Returns a map from distinct items in coll to the number of times they appear.

例:

user=> (frequencies "lazybrownfox")
{\a 1, \b 1, \f 1, \l 1, \n 1, \o 2, \r 1, \w 1, \x 1, \y 1, \z 1}

次に、キーを取得して文字列に変換する (または変換しない) だけです。

user=> (apply str (keys (frequencies "lazybrownfox")))
"abflnorwxyz"
于 2011-01-30T23:27:58.983 に答える