Clojure int для char (например, от 1 до \ 1) - PullRequest
0 голосов
/ 20 января 2020

Есть ли в CLojure путь к go от int к этому int в качестве символа, например, от 1 до \ 1?

У меня есть строка s, и я хочу разобрать цифры которые соответствуют номеру n (n всегда будет от 0 до 9)

например

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

Где ??? будет n как \ n, например, вернет "111"

Или, может быть, есть лучший способ отфильтровать строку только для одного экземпляра di git?

Ответы [ 2 ]

5 голосов
/ 20 января 2020

Путь "java":

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

Путь "исчисления" (добавьте к нему целое число \0 и затем обратно к символу):

user=> (char (+ 1 (int \0)))
\1
4 голосов
/ 20 января 2020

И, как обычно, в Clojure всегда есть одна строка в reduce, чтобы решить исходную проблему: «Я просто хочу подсчитать, сколько раз появляется di git».

(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 используется для поиска существующего ключа ch в m и вычисления нового значения (путем вызова функции, возвращаемой (fnil inc 0)), т. Е. Если ch не в m будет выполняться (inc 0) => 1, если ch находится в m, будет возвращаться увеличенный счетчик.

(fn [m ch] ...) - функция уменьшения. Это самая сложная часть для понимания. Требуется два параметра. Первым является последнее возвращаемое значение этой функции (созданное на более ранней итерации) или, если это первый раз, когда эта функция запускается, предоставляется начальное значение: {} (есть и третий способ вызова Reduce, см. (doc reduce) )

Второй аргумент ch является текущим символом в предоставленной строке (поскольку String является CharSequence и считается как коллекция).

Таким образом, функция сокращения вызывается для каждого символа и мы просто возвращаем текущую карту с обновленным счетчиком для каждого символа, начиная с {}.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...