删除保留订单的重复数组元素

时间:2017-04-20 10:30:41

标签: collections smalltalk pharo

是否有一种标准方法可以删除数组中的重复条目,但保留顺序?

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)"

但是有标准方法吗?

2 个答案:

答案 0 :(得分:1)

您的解决方案对我来说非常好。这是另一个:

withoutDuplicates
  | visited |
  visited := Set new.
  ^self select: [:element | 
    (visited includes: element) not
      ifTrue: [visited add: element];
      yourself]

这个更详细,但使用(仅)一个额外的集合:visited集。另一方面,OrderedDictionary有两个内部集合DictionaryorderedKeys序列。如果您不关心空间,我建议使用您的解决方案。

另外,我会说在这里使用#yourself有点不寻常。它遵循以下模式:

^boolean ifTrue: [self doThis]; yourself

self doThisboolean时会产生副作用(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