【问题标题】:How I can get element from set in clojure?如何从 clojure 中的集合中获取元素?
【发布时间】:2016-05-04 14:47:30
【问题描述】:

我已经设置了

(def tableOfStates [{:_ '\a :q0 'q1 :q1 'q1 :q2 'q3 :q3 '\_ }
                    {:_ '\b :q0 'q2 :q1 'q3 :q2 'q2 :q3 '\_}
                    {:_ '\c :q0 'q3 :q1 'q3 :q2 '\_ :q3 '\_}
                    {:_ '\$ :q0 '\_ :q1 '\_ :q2 '\_ :q3 'pass}])

我想以这种方式获取元素

((get tableOfStates 0) ":q0")

但返回nil

我该怎么做?

【问题讨论】:

  • 您正在传递一个字符串":q0",而您想要的内容是:q0 - 一个关键字。试试((get tableOfStates 0) :q0)
  • 您也可以使用get-in 代替get: (get-in tableOfStates [0 :q0])。顺便说一句,你的向量的内容不是集合,而是哈希映射
  • 我知道,但我的目标是当我只有一个字符串 ":q0" 时获取元素
  • 那么你应该为它设置一个关键字:((get tableOfStates 0) (keyword (subs ":q0" 1))) 或这样:((get tableOfStates 0) (clojure.edn/read-string ":q0"))
  • 谢谢,这对我有用

标签: arrays clojure elements


【解决方案1】:

(get-in tableOfStates [0 :q0])

这将返回您要查找的值,即与向量中第一个元素的键 :q0 关联的值。

如果您必须使用字符串,请执行以下操作:

(get-in tableOfStates [0 (keyword "q0")])

这首先将字符串转换为关键字。

来自 REPL:

> tableOfStates
[{:_ \a, :q0 q1, :q1 q1, :q2 q3, :q3 \_}
 {:_ \b, :q0 q2, :q1 q3, :q2 q2, :q3 \_}
 {:_ \c, :q0 q3, :q1 q3, :q2 \_, :q3 \_}
 {:_ \$, :q0 \_, :q1 \_, :q2 \_, :q3 pass}]
> (get-in tableOfStates [0 :q0])
q1
> (keyword "str")
:str
> (get-in tableOfStates [0 (keyword "q0")])
q1
> 

【讨论】:

    【解决方案2】:

    如果您将tableOfStatesstate transition table)从地图矢量更改为地图地图,您可以更简洁、更快地完成此操作>:

    (def tableOfStates {'\a {:q0 'q1 :q1 'q1 :q2 'q3 :q3 '\_}
                        '\b {:q0 'q2 :q1 'q3 :q2 'q2 :q3 '\_}
                        '\c {:q0 'q3 :q1 'q3 :q2 '\_ :q3 '\_}
                        '\$ {:q0 '\_ :q1 '\_ :q2 '\_ :q3 'pass}})
    

    我们这样使用它:

    ((get tableOfStates \a) :q0) ;q1
    

    ...或者只是

    ((tableOfStates \a) :q0) ;q1
    

    ...因为地图作为其自己的get 函数工作。

    我们直接使用\a。我们不必使用:_ 键来查找它。

    我认为您的印象是 keys 必须是 keywords,反之亦然。不是这样!事实上,状态的表示方式取决于它们所扮演的角色:

    • 作为键,它们是关键字 :q0:q1:q2:q3
    • 作为值,它们是对应的符号 'q0'q1 'q2'q3
    • (我假设)失败状态由 字符 \_ 表示。 (顺便说一句,不需要引用字符)。

    让我们将它们全部表示为关键字。桌子变成...

    (def tableOfStates {\a {:q0 :q1, :q1 :q1, :q2, :q3, :q3 :_}
                        \b {:q0 :q2, :q1 :q3, :q2 :q2, :q3 :_}
                        \c {:q0 :q3, :q1 :q3, :q2 :_, :q3 :_}
                        \$ {:q0 :_, :q1 :_, :q2 :_, :q3 :pass}})
    

    其他变化。

    使用nil 代替:_ 来表示失败 状态。那么你就不需要失败的转换了:

    (def tableOfStates {\a {:q0 :q1, :q1 :q1, :q2 :q3}
                        \b {:q0 :q2, :q1 :q3, :q2 :q2}
                        \c {:q0 :q3, :q1 :q3}
                        \$ {:q3 :pass}})
    

    例如,

    ((tableOfStates \$) :q0) ;nil
    

    看起来\$ 代表输入结束。如果提供了这个,很好。如果没有,您最好使用集合 #{:q3} 测试最终状态。

    【讨论】:

      猜你喜欢
      • 2016-02-26
      • 2015-03-05
      • 2013-05-13
      • 2022-01-22
      • 2011-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-08
      相关资源
      最近更新 更多