是否有一种标准方法可以删除数组中的重复条目,但保留顺序?
e.g。
#(c a b a a b) withoutDuplicates "-> #(c a b)"
我曾经使用removeDuplicates
,但显然这是Roassal添加的扩展方法(所以我不能总是使用它)
手写,最好的解决方案(我有)
a := #(c a b a a b).
d := OrderedDictionary new.
a do: [ :each | d at: each put: true ].
d keys. "-> #(c a b)"
但是有标准方法吗?
答案 0 :(得分:1)
您的解决方案对我来说非常好。这是另一个:
withoutDuplicates
| visited |
visited := Set new.
^self select: [:element |
(visited includes: element) not
ifTrue: [visited add: element];
yourself]
这个更详细,但使用(仅)一个额外的集合:visited
集。另一方面,OrderedDictionary
有两个内部集合Dictionary
和orderedKeys
序列。如果您不关心空间,我建议使用您的解决方案。
另外,我会说在这里使用#yourself
有点不寻常。它遵循以下模式:
^boolean ifTrue: [self doThis]; yourself
在self doThis
为boolean
时会产生副作用(true
),在任何一种情况下都会以boolean
回答。大多数人会把它写成:
boolean ifTrue: [self doThis].
^boolean
但这需要临时添加一个块,因为在我们的例子中boolean
引用了我们不应重复的表达式(visited includes: element) not
。
或... 强>
......您可以借此机会在Pharo中实施OrderedSet
...
答案 1 :(得分:1)
与您的相同,但在文字类型方面更短,而不是表现。
(#(c a f b c a d c a e f f) collect: [ :e | e -> true ]) asOrderedDictionary keys