Как мы можем отсортировать словари в массиве по определенному ключу в pharo?

У меня есть массив, содержащий несколько словарей. Как я могу отсортировать их, используя ключ, который каждый словарь имеет как возраст?

an Array((a Dictionary('age'->'20' 'ID'->1254))(a Dictionary('age'->'35' 'ID'->1350))(a Dictionary('age'->'42' 'ID'->1425)))

person ludo    schedule 19.01.2018    source источник
comment
Просто используйте блок сортировки. Например, чтобы отсортировать в порядке возрастания значения для 'age': anArrayOfDictionarys sort: [ :a :b | (a at: 'age') < (b at: 'age') ]. Документация Pharo/Smalltalk — ваш друг и первая линия защиты в знании этих вещей. :)   -  person lurker    schedule 19.01.2018
comment
@lurker, можете ли вы связать меня с документами, описывающими sort:/sorted:? потому что я не помню, чтобы это когда-либо встречалось в какой-либо книге Фарона.   -  person Peter Uhnak    schedule 19.01.2018
comment
@Питер, хорошо.... Прошу прощения, наверное, я сказал слишком рано. Я знал, что заказанные коллекции Pharo принимают сообщение sort:, но очевидно, что документы не обновлены.   -  person lurker    schedule 19.01.2018
comment
Людо, кажется, @Peter точно ответил на твой вопрос. Есть ли что-то, что мешает вам принять его ответ?   -  person lurker    schedule 20.01.2018
comment
да действительно люркер Кажется, это то, что мне нужно @Peter. Спасибо.   -  person ludo    schedule 21.01.2018


Ответы (1)


Вы можете сортировать, предоставляя блок сравнения; блок принимает два аргумента (два элемента из массива) и должен возвращать логическое значение.

data := { 
    { 'age' -> '20'. 'ID' -> 1254 } asDictionary.
    { 'age' -> '35'. 'ID' -> 1350 } asDictionary.
    { 'age' -> '42'. 'ID' -> 1425 } asDictionary
}.
sorted := data sorted: [ :a :b | (a at: 'age') > (b at: 'age') ].
  • sorted: вернет отсортированную коллекцию без изменения получателя
  • sort: выполнит сортировку на месте и вернет себя

Вы также можете использовать asSortedCollection:, который создаст новую коллекцию, которая всегда поддерживает инвариант сортировки.

sc := data asSortedCollection: [ :a :b | (a at: 'age') > (b at: 'age') ].

"automatically inserted between age 42 and 35"
sc add: {'age' -> '39'. 'ID' -> 1500} asDictionary.
sc "a SortedCollection(a Dictionary('ID'->1425 'age'->'42' ) a Dictionary('ID'->1500 'age'->'39' ) a Dictionary('ID'->1350 'age'->'35' ) a Dictionary('ID'->1254 'age'->'20' ))"
person Peter Uhnak    schedule 19.01.2018