首页 > 解决方案 > Smalltalk,从计数器字典中增加一个值

问题描述

我正在研究 Smalltalk,我有“推文”集合,每条推文都有“用户”,我想在字典中按用户计算推文。

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

我想在这段代码中添加,我想知道是否是人类可重复和高效的,还是有更好的方法来做到这一点

tweetCountUserFrom: tweet in: aDictionary
    | user |
    user := tweet user.
    aDictionary at: user ifAbsentPut: 0.
    aDictionary at: user put: (result at: user) + 1

标签: dictionarysmalltalk

解决方案


您的代码足够清晰(即使它可能包含错误,因为result变量应该是错误的aDictionary)。无论如何,意图是明确的,并且做(或预期做)与众所周知的对象相同的事情,即Bag. 所以,让我们看看代码会如何处理一个实例Bag(越来越熟悉CollectionSmalltalk 的层次结构总是一个好主意)。这是您如何获得相同结果的方法

tweetCountUserFrom: tweet in: aBag
  aBag add: tweet user

而已!

当您需要查看已创作tweetsuser数量时,您只需评估

 aBag occurrencesOf: user

在内部,aBag将持有 aDictionary并将按照您在代码中的预期方式维护它。但是,通过使用现有对象,您将使您的代码更简单、更短、更易于阅读和维护。您还将降低失败的可能性,因为Bags已经有 40 多年的历史了,所以他们几乎没有机会欺骗您。


推荐阅读