1

我的收藏是一个包含许多字典的集合。如何遍历 Set 中的每个字典以选择特定键。

a Set(a Dictionary('age'->'25' 'code'->2512) a Dictionary('age'->'40' 'code'->'1243') a Dictionary('age'->'35' 'code'->'7854'))
4

2 回答 2

4
set := {
    { 'age'->'25'. 'code'->'2512' } asDictionary .
    { 'age'->'40'. 'code'->'1243' } asDictionary.
    { 'age'->'35'. 'code'->'7854' } asDictionary.
} asSet.

如果您只对检索单个项目感兴趣,那么detect:就是要走的路。它将返回与谓词(块)匹配的第一个项目。请注意,Set它没有定义的顺序,因此如果您有多个匹配的项目,它可能会在不同的时间返回不同的项目。

d := set detect: [ :each | (each at: 'code') = '1243' ].
d. "a Dictionary('age'->'40' 'code'->'1243' )"

如果要检索与谓词都匹配的多个项目,请使用select:

multi := set select: [ :each | (each at: 'age') asNumber >= 35 ].
multi. "a Set(a Dictionary('age'->'40' 'code'->'1243' ) a Dictionary('age'->'35' 'code'->'7854' ))"

从评论更新评论:

正如卡洛斯已经说过的,collect:会做你需要的。它将转换块应用于集合中的每个项目,然后返回结果集合。

codes := set collect: [ :each | each at: 'code' ].

适用于任何收藏

#(2 3 4) collect: [ :each | each squared ] "#(4 9 16)"

为了进一步了解,我建议阅读 Pharo By Example 书中的 Collections 章节https://ci.inria.fr/pharo-contribution/job/UpdatedPharoByExample/lastSuccessfulBuild/artifact/book-result/Collections/Collections.html

于 2018-01-24T10:07:35.750 回答
0
mySet do: [:each | each do: [ :i | i doStuff ]]

或使用检测(我不确定检测是否像这样工作,到目前为止我从未使用过):

mySet do: [:i | i detect: [ :each| (each at: 'key') doStuff ]].

或使用keysDo:

mySet do: [:each | each keysDo: [ :k | k doStuff ]]

查看: http: //pharo.gforge.inria.fr/PBE1/PBE1ch10.html

于 2018-01-24T09:49:14.557 回答