Как нам перебрать и выбрать элемент множества в pharo?

Моя коллекция - это Набор, содержащий несколько словарей. Как можно перебирать каждый словарь в наборе, чтобы выбрать определенный ключ.

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

2 ответа

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 https://ci.inria.fr/pharo-contribution/job/UpdatedPharoByExample/lastSuccessfulBuild/artifact/book-result/Collections/Collections.html

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

или используйте функцию обнаружения (я не уверен, работает ли функция обнаружения подобным образом, я до сих пор не использовал ее):

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

или используйте ключи:

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

Проверьте: http://pharo.gforge.inria.fr/PBE1/PBE1ch10.html

Другие вопросы по тегам