Smalltalk中如何对OrderedCollection按键排序并保留键值对?
在Smalltalk中对OrderedCollection的键值对按键排序并保留完整对象
看起来你是不小心在排序过程中只提取了键,导致结果只返回键而不是完整的键值对。别担心,这是个很常见的小问题,调整一下排序的方式就能解决。
首先,假设你的OrderedCollection里存储的是Association对象(就是Smalltalk里标准的键值对,比如#name -> 'Alice'这种形式),我们直接对集合里的完整元素排序,比较它们的键就可以了:
示例代码
先定义一个包含无序键值对的集合:
| myCollection sortedPairs | myCollection := OrderedCollection with: (#banana -> 5) with: (#apple -> 3) with: (#cherry -> 7).
如果你之前的写法是类似这样(只返回键):
# 错误示例:只提取键再排序,结果只有键 myCollection collect: [:pair | pair key] sorted: [:a :b | a < b]. "返回结果:#(#apple #banana #cherry)"
那正确的做法是直接对整个集合使用sorted:方法,比较每个键值对的key:
# 正确写法:保留完整键值对的排序 sortedPairs := myCollection sorted: [:pair1 :pair2 | pair1 key < pair2 key]. "返回结果:OrderedCollection(#apple->3, #banana->5, #cherry->7)"
额外说明
- 如果你想直接修改原集合而不是生成新集合,用
sort:方法(注意没有末尾的ed):myCollection sort: [:pair1 :pair2 | pair1 key < pair2 key]. "现在myCollection本身已经是排序后的完整键值对集合了" - 如果你的键值对不是标准的
Association,而是自定义对象,只需要把pair key换成你对象里获取键的方法就行(比如如果你的对象有#itemKey方法,就写pair1 itemKey < pair2 itemKey)。
这样就能得到按键排序后的完整键值对集合啦!
内容的提问来源于stack exchange,提问作者Mia
相关产品推荐
相关产品推荐

