Smalltalk,从计数器字典中增加一个值
Smalltalk, increment a value from a dictionary of counters
我正在使用 Smalltalk,我有 "tweets" 集合,每条推文都有 "user",我想在字典中按用户计算推文数量。
所以我必须在字典的每个键中添加一个计数器,并且必须在第一次获得用户时添加键。
我在考虑这段代码中的添加,我想知道人类是否可以重新执行和高效地执行此操作,或者是否有更好的方法来执行此操作
tweetCountUserFrom: tweet in: aDictionary
| user |
user := tweet user.
aDictionary at: user ifAbsentPut: 0.
aDictionary at: user put: (result at: user) + 1
您的代码足够清晰(尽管它可能包含一个错误,因为 result
变量应该是 aDictionary
)。无论如何,意图很明确,并且做(或预期做)与众所周知的对象相同的事情,即 Bag
。那么,让我们看看代码如何使用 Bag
的实例(越来越熟悉 Smalltalk 的 Collection
层次结构总是一个好主意)。这是您如何获得相同结果的方法
tweetCountUserFrom: tweet in: aBag
aBag add: tweet user
就是这样!
当您需要查看 tweets
个 user
的作者数量时,您只需评估
aBag occurrencesOf: user
在内部,aBag
将持有一个 Dictionary
并将按照您在代码中预期的方式维护它。但是,通过使用现有对象,您可以使代码更简单、更短并且更易于阅读和维护。你也会降低失败的可能性,因为 Bags
已经玩了 40 多年了,所以他们几乎没有机会欺骗你。
我正在使用 Smalltalk,我有 "tweets" 集合,每条推文都有 "user",我想在字典中按用户计算推文数量。
所以我必须在字典的每个键中添加一个计数器,并且必须在第一次获得用户时添加键。
我在考虑这段代码中的添加,我想知道人类是否可以重新执行和高效地执行此操作,或者是否有更好的方法来执行此操作
tweetCountUserFrom: tweet in: aDictionary
| user |
user := tweet user.
aDictionary at: user ifAbsentPut: 0.
aDictionary at: user put: (result at: user) + 1
您的代码足够清晰(尽管它可能包含一个错误,因为 result
变量应该是 aDictionary
)。无论如何,意图很明确,并且做(或预期做)与众所周知的对象相同的事情,即 Bag
。那么,让我们看看代码如何使用 Bag
的实例(越来越熟悉 Smalltalk 的 Collection
层次结构总是一个好主意)。这是您如何获得相同结果的方法
tweetCountUserFrom: tweet in: aBag
aBag add: tweet user
就是这样!
当您需要查看 tweets
个 user
的作者数量时,您只需评估
aBag occurrencesOf: user
在内部,aBag
将持有一个 Dictionary
并将按照您在代码中预期的方式维护它。但是,通过使用现有对象,您可以使代码更简单、更短并且更易于阅读和维护。你也会降低失败的可能性,因为 Bags
已经玩了 40 多年了,所以他们几乎没有机会欺骗你。