Clojure int to char (e.g. 1 to 1)

  • 本文关键字:to int char Clojure clojure
  • 更新时间 :
  • 英文 :


他们在 Clojure 中是否是一种从 int 到该 int 作为字符的方式,例如 1 到 \1?

我有一个字符串s我想解析出与数字n匹配的数字(n 将始终为 0 到 9(

例如

(let [n 1]
(filter #(= ??? %) "123123123"))

其中 ??? n 为 ,例如返回"111">

或者也许有更好的方法将字符串过滤为仅个位数的实例?

"java"方式:

user=> (Character/forDigit 1 10) ; number and radix
1

"演算"方式(将的 int 添加到其中,然后回到 char(:

user=> (char (+ 1 (int )))
1

和往常一样,在Clojure中,总有一行reduce来解决原始问题:"我只想要那个数字出现的次数。

(reduce (fn [m ch] (update m ch (fnil inc 0))) {} "123123123")
==> {1 3, 2 3, 3 3}

这里有很多东西要解开,如果你是Clojure的新手。 Reduce用于迭代字符串,计算每个字符的出现次数并将其存储在映射中。

从内到外:

(fnil inc 0)返回一个函数,该函数使用提供的任何参数inc运行。但是,如果参数为 nil,它将用 0 替换它。这非常适合向地图添加新条目。

update用于查找m中的现有键ch并计算一个新值(通过调用(fnil inc 0返回的函数((,即如果ch不在m这将(inc 0) => 1运行,如果chm中,它将返回递增的计数器。

(fn [m ch] ...)是还原功能。 这是最难理解的部分。它需要两个参数。 第一个是此函数的最后一个返回值(由较早的迭代生成(,或者如果它是此函数第一次运行,则提供的初始值:{}(还有第三种调用reduce的方法,请参见(doc reduce)(

ch第二个参数是提供的字符串中的当前字符(因为字符串是 CharSequence 并计为集合(。

因此,为每个字符调用归约函数,我们只需返回当前映射,其中包含每个字符的更新计数,从{}开始。

最新更新