Как мы можем проверить в pharo, если элемент уже существует в наборе
Скажем, у меня есть функция, которая постоянно добавляет случайное число в коллекцию после каждого обновления.
Myfunction
|list length data |
z := Set new.
x := 8.
data:= received data after each refresh.
length := data size.
1 to: length do:[:k | list := data at: k.
list < x
"How to check if this data already exist and not add"
ifTrue:[z add: list]
Как я могу проверить в Pharo, если номер уже существует, и если это так, он не должен добавить его снова?
1 ответ
Наборы и другие базовые коллекции являются частью общего Smalltalk. Вы должны взглянуть на документацию по Smalltalk (например, руководство по Smalltalk), в частности, ссылки на каждый из типов данных, которые вы пытаетесь использовать, а также другие связанные с ними.
Если вы читаете документацию для Set
вы найдете сообщение #includes:
который вернет истину, если аргумент находится в наборе, и вернет ложь, если это не так. Это будет выглядеть так:
(z includes: list) ifTrue: [ z add: list ]
Но, Set
по определению содержит уникальные элементы. Поэтому, если вы попытаетесь добавить элемент, который уже находится в наборе, Smalltalk не добавит его снова и не выдаст ошибку, если вы попытаетесь это сделать. Так что вам не нужно проверять, включает ли набор уже list
, Вы можете просто добавить это.
Затем вы выполняете обход данных долгим и трудным путем. Вам не нужно получать длину, а затем зацикливать индекс от 1 до этой длины. Я предполагаю, что ваши данные являются своего рода коллекцией Smalltalk, так что вы можете просто использовать #do:
сообщение. #do:
Сообщение позволяет вам перебрать блок по каждому элементу коллекции:
data do: [ :each | each < x ifTrue: [ z add: each ] ]
Это заменяет все, что вы показали, начиная с length := ...
,