我正在使用字典,其中键是字符串,值是整数。我怎样才能从这个字典中得到最大值的键?

我知道有 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 而是使用 BagBag 的实例表示对象的集合,每个对象可能有多次出现。例子:
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 ,但对于您的模型,BagDictionary 可以更好地揭示您的意图,因为您只需要 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/

10-16 00:17