Распечатайте коллекцию SortedCollection на экране с помощью keysAndValueDo (smalltalk)

Здравствуйте, я учусь, и я новичок в smalltalk, и я пытаюсь распечатать коллекцию SortedCollection на экране, пытаясь использовать keysAndValueDo, но я не уверен, как это сделать, если кто-нибудь может дать мне общий пример, который был бы отличным

2 ответа

Решение

Часть 1 - Отображение на экран
Самый простой способ печати на экране в Smalltalk на основе графического интерфейса - это использовать сообщение:
Transcript show: 'some text'
(Стенограмма - это системный объект, который отображается в прокручиваемом окне).

Чтобы убедиться, что перед каждой строкой отображаемого текста стоит новая строка, мы отправляем сообщение cr к стенограмме

Transcript cr.
Transcript show: 'some text'.

Сокращенный метод, который спасает нас от повторного набора Transcript снова и снова, чтобы послать Transcript серию сообщений одно за другим. Это называется каскадом сообщений. Каждый раз, когда мы заканчиваем сообщение в ; это означает отправку тому же получателю, на который было отправлено последнее сообщение.

Затем мы можем сократить это снова, поскольку Smalltalk не обращает внимания на переводы строк в выражениях.

Конечный каскад отображаемых сообщений становится:
Transcript cr; show: 'some text'.

Часть 2. Перечисление aSortedCollection с использованием keysAndValuesDo: это сообщение с ключевым словом SequencableCollection и заголовок его метода:
keysAndValuesDo: aBlock "Enumerate the receiver with all the keys (aka indices) and values."

(Это работает так же в Dolphin, и в Squeak и его производных, Pharo и Cuis).

Ключевое сообщение keysAndValuesDo: принимает аргумент блока.
Блок - это анонимный объект с одним методом. Его метод определен между соответствующей парой квадратных скобок - [... ] пара.

В этом случае нам нужна локальная переменная в блоке для ключа каждого элемента коллекции и другая локальная переменная для значения каждого элемента.

Мы можем называть их как угодно, и в этом случае важен порядок, в котором они появляются. keysAndValuesDo: поместит ключ элемента в первую локальную переменную в блоке и поместит значение элемента во вторую локальную переменную в блоке.

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

Блок выглядит так
[:local1 :local2 | "do something for each element, with the key in local1 and the value in local2" ]

Я предпочитаю значимые имена локальных переменных, поэтому я буду использовать eachKey а также eachValue,

Часть 3: Собираем все вместе
Перечислять через mySortedCollection

"Declare the mySortedCollection variable"
|mySortedCollection| 

"Initialise the collection"
mySortedCollection := SortedCollection new.  

"add in some data to the collection"
mySortedCollection add: ('First') ;
                   add: ('Second') ;
                   add: ('Third').

"Enumerate through the collection, displaying to the Transcript window"
mySortedCollection keysAndValuesDo: 
   [:eachKey :eachValue | 
    Transcript cr; show: eachKey; show: ' '; show: eachValue
] .

Вставьте код в рабочую область (известную как игровая площадка в Pharo, начиная с версии 4.0). Выберите текст. После выбора щелкните правой кнопкой мыши (на кнопку с двумя или тремя кнопками) и выберите "Сделать это" из меню. Или используйте Ctrl-d в качестве сочетания клавиш. (Точный ключ записи зависит от вашей платформы)

Финальные заметки
В SortedCollection или OrderedCollection ключом является индекс. Значение - это то, что хранится в элементе [index].

В словаре ключом элемента является ключ, а значением элемента является значение.

SortedCollections сортируются в порядке значений элементов в соответствии с определением блока сортировки коллекций. При отсутствии пользовательского блока сортировки они будут добавляться в порядке возрастания. 'First', 'Second' а также 'Third' по совпадению, в алфавитном порядке. Это получается хорошо в этом примере.

Следующий пример работает с Pharo Smalltalk, другая реализация Smalltalk может работать аналогично.

  1. Сначала рассмотрим существующие методы печати в качестве примеров. В случае SortedCollectionвы найдете их в printing протокол его суперкласса Collection,

  2. Вы обнаружите, что печать элементов определяется в printElementsOn:, Таким образом, вы можете переписать этот метод в SortedCollection,

Вот printElementsOn: метод, который будет использовать keysAndValuesDo:, как вы просили:

printElementsOn: aStream
    aStream nextPut: $(.
    self keysAndValuesDo: [:key :value | 
        aStream
            nextPut: $(;
            print: key;
            nextPut: $:;
            space;
            print: value;
            nextPut: $)].
    aStream nextPut: $)

Теперь коллекция, которая раньше печаталась:

"Сортированная коллекция (1 2 3 3 5 10)"

напечатает:

"Сортированная коллекция ((1: 1)(2: 2)(3: 3)(4: 3)(5: 5)(6: 10))"

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