Smalltalk,从计数器字典中增加一个值

Ema*_*uel 3 dictionary smalltalk

我正在使用Smalltalk,我有"tweets"集合,每条推文都有"用户",我想在字典中按用户统计推文.

所以我必须在字典的每个键中添加一个计数器,并且必须在第一次获得用户时添加键.

我在这个代码中考虑添加,我想知道人类是否可以重新使用和高效还是有更好的方法来实现它

tweetCountUserFrom: tweet in: aDictionary
    | user |
    user := tweet user.
    aDictionary at: user ifAbsentPut: 0.
    aDictionary at: user put: (result at: user) + 1
Run Code Online (Sandbox Code Playgroud)

Lea*_*lia 8

你的代码足够清晰(即使它可能包含一个错误,因为result变量应该是aDictionary相反的).无论如何,意图是清楚的,并且确实(或者预期会)与众所周知的对象相同,即Bag.那么,让我们看看代码将如何与一个实例一起使用Bag(熟悉CollectionSmalltalk 的层次结构总是一个好主意).这是你如何得出相同的结果

tweetCountUserFrom: tweet in: aBag
  aBag add: tweet user
Run Code Online (Sandbox Code Playgroud)

而已!

当它是时间给你看多少tweets一个user撰写,你只需要评估

 aBag occurrencesOf: user
Run Code Online (Sandbox Code Playgroud)

在内部,aBag将保持Dictionary并将按照您在代码中的预期方式进行维护.但是,通过使用现有对象,您将使代码更简单,更简单,更易于阅读和维护.你也将减少失败的可能性,因为Bags现在已经开了40多年了,所以他们几乎没有机会解雇你.