我们如何检查一个元素是否已存在于集合中

时间:2018-01-25 21:00:00

标签: smalltalk pharo pharo-5

假设我有一个在每次刷新后不断向集合中添加随机数的函数。

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 个答案:

答案 0 :(得分:3)

集合和其他基本集合是常见Smalltalk的一部分。您应该查看Smalltalk文档(例如Smalltalk bluebook),特别是您尝试使用的每种数据类型的引用以及其他相关数据类型。

如果你阅读了Set的文档,你会发现一条消息#includes:,如果参数在集合中,它将返回true,如果不在,则返回false。那看起来像是:

(z includes: list) ifTrue: [ z add: list ]

但是,根据定义,Set包含唯一元素。因此,如果您尝试添加已经在集合中的元素,Smalltalk将不再添加它,如果您尝试这样做,则不会给您错误。因此,您无需检查该集合是否已包含list。你可以添加它。

然后,您正在以漫长而艰难的方式遍历数据。您不需要获取长度然后循环索引从1到该长度。我假设您的数据是某种Smalltalk Collection ,因此您只需使用#do:消息即可。 #do:消息允许您在集合的每个元素上迭代块:

data do: [ :each | each < x ifTrue: [ z add: each ] ]

这取代了您从length := ...开始显示的所有内容。