我们如何在pharo中迭代并选择集合的元素?

时间:2018-01-24 09:45:44

标签: smalltalk pharo pharo-5

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

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

2 个答案:

答案 0 :(得分:4)

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

适用于任何收藏品

@switch($message)
  @case(Session::get('success'))
    <div class="alert alert-success alert-block">
      <strong>{!! $message !!}</strong>
    </div>
  @break

  @case(Session::get('danger'))
   <div class="alert alert-danger alert-block">
     <strong>{!! $message !!}</strong>
   </div>
  @break

  @default
    <span>Something went wrong, please try again</span>
@endswitch

为了进一步推荐,我建议您阅读Pharo By Example书籍https://ci.inria.fr/pharo-contribution/job/UpdatedPharoByExample/lastSuccessfulBuild/artifact/book-result/Collections/Collections.html

中的收藏章节

答案 1 :(得分:0)

mySet do: [:each | each do: [ :i | i doStuff ]]

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

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