Как мы можем проверить в 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 := ...,

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