我正在使用字典,其中键是字符串,值是整数。我怎样才能从这个字典中得到最大值的键?
我知道有 associationsDo:
方法可以用来迭代键和值,但我不知道如何获得最大值。
| countDict |
countDict := Dictionary new.
...
countDict associationsDo: [ :k :v | ??? ]
最佳答案
这是按照您的想法进行操作的方法:
| max largest |
max := nil.
countDict associationsDo: [:k :v |
(max isNil or: [v > largest])
ifTrue: [
max := k.
largest := v]].
^max
这是另一种方法,更短但效率不高:
countDict isEmpty ifTrue: [^nil].
^countDict keyAtValue: countDict max
另外,如果您有
countDict
,我怀疑它代表每个键的出现次数。如果是这种情况,您不应该使用 Dictionary
而是使用 Bag
。 Bag
的实例表示对象的集合,每个对象可能有多次出现。例子:names := Bag new.
people do: [:person | names add: person firstName].
你可能会得到2 occurrences of 'John'
1 occurrence of 'Paul'
4 occurrences of 'Ringo'
7 occurrences of 'George'
names occurrencesOf: 'John' ----> 2
Bag
内部将有一个 countDict
类型的 Dictionary
,但对于您的模型,Bag
比 Dictionary
可以更好地揭示您的意图,因为您只需要 add:
元素而不必计算它们; Bag
会为你做这件事。使用
Bag
你的计算变成bag occurrencesOf: bag asSet max
发送 asSet
的原因是为了避免对每个值进行多次迭代,如果我们简单地放置 bag max
就会发生这种情况。这个更简单的代码也可以工作,但考虑到 max
使用 do:
进行迭代,而 Bag
通过为元素的每次出现重复块的评估来实现 do:
,这个解决方案的效率会降低。更好的方法是在
max
中重新实现 min
(和 Bag
),以便每个元素迭代一次。这将类似于我们上面遵循您最初想法的代码(associationsDo: [
...)。但是,让我们将此细节留给读者作为练习。无论如何,如果我们在
max
中重新实现 Bag
,代码会立刻变得简单高效: bag occurrencesOf: bag max
关于smalltalk - 从 Smalltalk 的字典中获取具有最大值的键,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41074421/