我如何从 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}
.
测试最终状态
我已经设置了
(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}
.