从Smalltalk中的字典中获取值最大的键

从Smalltalk中的字典中获取值最大的键,smalltalk,pharo,Smalltalk,Pharo,我正在使用一个字典,其中键是字符串,值是整数。我怎样才能从这本字典中得到最大值的密钥 我知道有associationsDo:方法可以用来迭代键和值,但我不知道如何获得最大值 | countDict | countDict := Dictionary new. ... countDict associationsDo: [ :k :v | ??? ] 以下是按照您的想法进行操作的方法: | max largest | max := nil. countDict associationsDo: [

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

我知道有
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
,我怀疑它代表每个键的出现次数。如果是这种情况,你不应该使用
字典
,而应该使用
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
类的
字典
,但是对于您的模型,一个
Bag
可以比一个
字典
更好地揭示您的意图,因为您只需要添加:元素,而无需对它们进行计数;
会帮你的

使用
您的计算变得

bag occurrencesOf: bag asSet max
发送
asSet
的原因是为了避免在每个值上重复多次,如果我们简单地放置
bag max
,就会发生这种情况。这个更简单的代码也可以工作,但是如果
max
使用
do:
进行迭代,并且
Bag
通过对元素的每次出现重复对块的求值来实现
do:
,那么这个解决方案的效率会更低

更好的方法是在
Bag
中重新实现
max
(和
min
),以便每个元素迭代一次。这类似于我们上面的代码,它遵循了您最初的想法(
associationsDo:[
…),但让我们将此细节留给读者作为练习

无论如何,如果我们在
Bag
中重新实现
max
,代码将立即变得简单高效:

 bag occurrencesOf: bag max

另一个很好的方法是:

(countDict associations detectMax: #value) key

我认为您正在从字典中获取具有最大键大小的键。我正在查找具有最大关联值的键。那么它不应该是
(max isNil或:[v>size])
和assign
size:=v
?此外,虽然这是一个很好的解决方案,但我希望一些内置的
最大值
函数可以做到这一点,但可能没有。你是对的。我误解了你。我更改了代码。谢谢!我一直在寻找的一行代码,太棒了!