我如何从 clojure 中的集合中获取元素?

How I can get element from set in clojure?

我已经设置了

(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")

但是returnsnil

我该怎么做?

(get-in tableOfStates [0 :q0])

此 returns 您要查找的值,即与向量中第一个元素的键 :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
> 

如果将 tableOfStates、a state 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.
  • (我假设)失败状态由 字符 \_ 表示。 (顺便说一句,不需要引用字符)。

让我们将它们全部表示为关键字。 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}})

其他变化。

使用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}.

测试最终状态