Как нам перебрать и выбрать элемент множества в 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 ]]