如何更优雅地在 Ruby 数组所有元素中移除重复项?

6

我希望能够在一个Array对象中移除重复的项目。最好用一个例子来解释。

我有以下的Array

entries = ["a b c", "a b", "c", "c d"]

我需要一个方法来清理这个数组,删除数组中每个元素内部的重复项,并返回一个只包含唯一项的数组。

下面是我编写的方法:

class Array
  def clean_up()
    self.join(" ").split(" ").uniq
  end
end

现在当我调用 entries.clean_up 时,结果如下:

["a", "b", "c", "d"]

这正是我想要的结果,但在Ruby中是否有更优雅的方法?

我会循环遍历每个元素,将它们拆分成一个大的术语数组,然后去重。 - Sukima
你想要优雅还是高性能?两者并不总是兼得。 - Ed S.
我认为在你所拥有的和@muistooshort所建议的之间,这是一个不确定的选择。你不需要self,因为它是接收者的默认值。[μ也不需要 :-).] - Cary Swoveland
@CarySwoveland:不,self并非必须的,但我编写的代码实际上需要得到维护(由我和其他人),而且我发现明确指定接收者可以使这个过程更加容易。 - mu is too short
这个问题似乎不适合在此讨论,因为它涉及到改进工作代码,并且应该发布在[codereview.se]上。 - the Tin Man
显示剩余7条评论
1个回答

1

split默认情况下会按空格进行分割(当然,假设你没有做什么疯狂的事情,比如改变了$;)。你想要分割每个字符串并将结果平铺到一个列表中,任何时候如果你想要“对每个元素执行X操作并平铺”,你都需要使用flat_map。将它们放在一起就得到了:

self.flat_map(&:split).uniq

如果你只想按空格分割或者不想依赖于清晰度,那么可以这样做:

self.flat_map { |s| s.split(' ') }.uniq

或类似的。

谢谢,这个方法可以得到我想要的结果。除了使用 flat_map 这种专为此类操作设计的方法之外,您能否解释一下它是否比我提供的解决方案更好? - Chess Mates
我喜欢这种方法,因为它更接近意图,join/split 通过诡计而不是直接表达意图来获得结果。当然,这里有很多观点。 - mu is too short

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接