【问题标题】:How to just get key only on GNU Smalltalk?如何仅在 GNU Smalltalk 上获取密钥?
【发布时间】:2019-04-15 06:35:24
【问题描述】:

我目前正在使用 sortedCollection 存储字符字典(键)和该字符(值)的出现次数。遍历 sortedCollection 时,如何只访问键值?

例如

[que last notNil] whileTrue: [
    stdout << 'current character is ' *key* << ' and occurs << *val* << ' times.' << nl.
]

其中que 是按值对字典进行排序的 sortedCollection。

我的目标如下:假设que 有: [$a:20, $e:100] 其中第一个字母是字典的键,第二个数字是字典的值。我的输出应该是这样的:

current character is a and occurs 20 times. current character is e and occurs 100 times.

我不确定如何获取a,或者字典中的键,因为键是任意的。

【问题讨论】:

  • 您没有展示如何构建集合队列,但似乎要检索键和值,您应该使用 SortedDictionary 或关联的排序集合
  • 对不起,que 定义如下:que = sortedCollection new . que := add: nodeLeaf. 其中nodeLeaf := Dictionary new. 并遍历keyAndValuesDo,它具有字符及其出现次数我明白字典尚未排序,但我想我看到了如何在不同的帖子上按值对字典进行排序,所以我会先尝试。
  • @selfPointer 你能用你拥有的实际代码更新这个问题吗?例如,没有提及 keysAndValuesDo: 以及您在问题中如何使用它。
  • 所以你是说que 是字典的排序集合?

标签: smalltalk gnu-smalltalk


【解决方案1】:

假设que 是一个排序集合,每个元素都是一个关联,其中字符为键,计数为值,如您的[$a:20, $e:100] 示例中,您可以这样做:

que do: [:each | stdout << 'current character is ' << each key
                        << ' and occurs ' << each value << ' times.' << nl]

如果 que 是字典,请使用 que keysAndValuesDo: [:char :count | stdout &lt;&lt; "..." char &lt;&lt; "..." count &lt;&lt; "..." nl]。

根据您的整个应用程序,您还可以使用 Bag,它是一个可以多次出现的无序元素集合(与 Set 不同,它只包含每个元素一次)。

characters := 'hello world' asBag.
characters asSet do: [:each |
    stdout << 'current character is ' << each
           << ' and occurs ' << (characters occurrencesOf: each) 
           << ' times.' << nl]

您还可以查看#sortedByCount 方法,看看它是否适合您的情况。我无法从参考中得知它返回的集合的确切结构,因此我不会为您提供猜测的示例代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-17
    • 2018-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-07
    相关资源
    最近更新 更多