【问题标题】:How do we iterate and select an element of a set in pharo?我们如何在 pharo 中迭代和选择集合中的一个元素?
【发布时间】:2018-01-24 09:45:44
【问题描述】:

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

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

【问题讨论】:

  • 你的脚本很可疑。为什么要在每个 Dictionary 中重复键 'age''code' 开始。您是否有机会尝试创建 Json 文件或类似的东西?
  • 为什么要怀疑@LeandroCaniglia。我创建了这个 json 作为我正在使用的真实的示例,因为它有更多的键
  • 也许 suspicious 不是这个词。我的意思是,您的代码很多不足以代表您要解决的问题(使用 json 格式序列化一些 Smalltalk 对象),我只是想确认实际问题是什么。

标签: smalltalk pharo pharo-5


【解决方案1】:
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' ))"

评论更新:

正如 Carlos 已经说过的,collect: 将满足您的需求。它将转换块应用于集合中的每个项目,然后返回结果集合。

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

适用于任何收藏

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

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

【讨论】:

  • 谢谢@Peter。如果我想存储每个代码的值而不是在块中指定值,我该怎么做?
  • 集合就是一个集合,迭代集合的方法有一整类。如果你想使用Smalltalk,你应该很快熟悉它们。要获取每个代码的值,您可以使用代码 := set collect: [ :each | each at: 'code'].. 他们还结合了诸如 #select:thenCollect: 之类的消息
  • @ludo 不明白你的意思,你能详细说明一下吗?
  • @Peter 我的意思是像 Carlos 解释的那样获取每个代码的值,但使用循环
【解决方案2】:
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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 2018-01-08
    • 2018-06-19
    • 2010-09-12
    • 2023-03-29
    • 1970-01-01
    • 2017-11-29
    相关资源
    最近更新 更多