【问题标题】:Read list of numbers by place value? (ClojureScript tricks)按位值读取数字列表? (ClojureScript 技巧)
【发布时间】:2018-02-09 10:39:17
【问题描述】:

我今天想知道我是否有一个数字列表。 ClojureScript 中是否有一个函数可以按位值返回由数字组成的数字? (我不是指list(),只是一些数字)

例如:

我有一些数字 1、2、3,我正在寻找将其转换为 123(一百二十三)的函数。

我以为我通过read-string找到了解决方案

(read-string (str 1 2 3))
;=> 123

但遗憾的是,如果我想在下面讨论的函数中使用它,它就不能很好地工作。

我有一个“函数式”映射,其中键是向量,值是数字。像这样: {[0 0] 0, [0 1] 1, ... [4 5] 45, ... [9 9] 99}

我可以在这张地图上使用get 函数的唯一方法是:

(get {[0 2] 2} [0 2])
;=> 2
; or
(get {[4 5] 45} [4 5])
;=> 45

这很糟糕,但它确实有效。为了让它看起来更好,我尝试在我使用read-string 的地方定义一个函数:(读取/指的是cljs.reader)

(defn get-oxo [x y]
  (get {[x y] (read/read-string (str x y))} [x y]))
;So i can use it like this for e.g.:
(get-oxo 4 5)
;=> 45

它还返回不在地图中的值:

(get-oxo 112 358)
;=> 112358

我想问题是这样get-oxo返回的不是配对键的值,而是由x y构造的数字...

所以问题是如何修复它以返回配对键的值,而不是从我给函数的数字构造的数字?

(如果我想生成一个具有更广泛数字范围的地图,例如不仅仅是 0-9 而是 0-99,还有另一个问题。这样get-oxo 的算法不正确。我使用讨论的函数在:ClojureScript zipmap tricks me or what?)。

【问题讨论】:

  • 如果地图不是get 函数的参数,你想如何从地图中获取项目?我的意思是你正在获得你产生的价值。就是这样。似乎您对编程有根本的误解,而不仅仅是 clojure 编程。
  • 如果您只对它的键感兴趣而不对它的值感兴趣,那么使用地图的意义何在?
  • @TaylorWood 我稍后会定义值,还不清楚。

标签: clojure clojurescript


【解决方案1】:

问题是你得到了什么:

只需分解你的函数以清楚地看到它:

(defn get-oxo [x y]
  (let [new-map {[x y] (read/read-string (str x y))}]
    (println new-map)
    (get new-map [x y])))
#'user/get-oxo

user> (get-oxo 100 200)
;;=> {[100 200] 100200}
;;=> 100200

所以你在函数内部生成你的地图,并得到它的关键 你得到......一个完全有效的行为

要从 your 地图中获取某些信息,您需要将 your 地图作为get 函数的第一个参数

(defn get-oxo [input x y]
  (get input [x y]))
#'user/get-oxo

user> (def data {[0 0] 0 [0 1] 1 [0 2] 2})
#'user/data

user> (get-oxo data 0 1)
1

user> (get-oxo data 2 3)
nil

然后,如果您需要键(我的意思是映射中的对)而不是值,您可以这样修改它,使用 find 函数而不是 get

(defn get-oxo [input x y]
  (first (find input [x y])))
#'user/get-oxo

user> (get-oxo data 0 1)
[0 1]

user> (get-oxo data 2 3)
nil

同时写入和读取字符串以获取数字看起来是多余的。您可以轻松地为此创建一个简单的函数:

(defn digits->num [digits]
  (reduce (fn [acc d] (+ (* 10 acc) d))
          0
          digits))
#'user/digits->num

user> (digits->num [0])
0

user> (digits->num [])
0

user> (digits->num [1])
1

user> (digits->num [1 2 3 4])
1234

user> (digits->num [0 0 1 0])
10

【讨论】:

  • 好的,我现在意识到了两件事。
  • 好的,我现在意识到了两件事。 1. 当我定义get-oxo 时,我完全傻了。没有更多的关于这个...... 2.我不够清楚。您的解决方案的问题在于它适用于地图,但实际上我的地图是函数......我的意思是我使用函数来生成地图,所以我不能将其视为数据。 (以这种方式生成地图很重要)。在这种情况下有没有办法在生成的地图上进行参考?其他建议?
  • 无论如何,感谢您的回答,这对我帮助很大,我还学到了一个新东西:find
  • 如果你能用 1)你的地图生成函数的签名,2)你需要组成的函数的签名(getter)以及你如何更新你的答案,那就太好了想用它。你上面的评论让它变得更加模糊:你有功能,生产一个集合,你想从那个集合中获取价值。因此,您调用此函数并从其输出(即地图)中获取密钥。我哪里错了?
  • 你是完全正确的。如果我有更多时间,我会定义一个新的、更容易理解的问题,并邀请你去那里。
【解决方案2】:

您可以简单地 apply str 对您的数字序列起作用:

(apply str '(1 2 3))
;; => "123"

【讨论】:

  • 是的,这正是我所做的。如果您已经阅读了整个问题,那么问题就会出现在下一步中。 (我知道这篇文章很长,抱歉)。
  • 哦,也许我不够清楚。我编辑帖子。
猜你喜欢
  • 1970-01-01
  • 2021-02-07
  • 1970-01-01
  • 2015-04-13
  • 1970-01-01
  • 2011-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多