在Ruby中从数组中有条件地删除重复项

时间:2014-02-18 03:39:48

标签: ruby

所以我有这个数组:

['One', 'Two', 'One', 'One', 'Three', 'Three', 'One']

我想得到这个结果:

['One', 'Two', 'One', 'Three', 'One']

所以我想删除与上一项相同的项目。 如何在Ruby中做到这一点?

2 个答案:

答案 0 :(得分:5)

使用Enumerable#chunk

ary = ['One', 'Two', 'One', 'One', 'Three', 'Three', 'One']
ary.chunk {|x| x }.map(&:first)

#=> ["One", "Two", "One", "Three", "One"]
  

Enumerable#chunk枚举项目,根据块的返回值将它们组合在一起。返回相同块值的连续元素被组合在一起。

ary.chunk {|x| x }.to_a
=> [["One", ["One"]],
 ["Two", ["Two"]],
 ["One", ["One", "One"]],
 ["Three", ["Three", "Three"]],
 ["One", ["One"]]]

map(&:first) Array#map遍历数组,在数组的每个元素上调用first方法

&:first被称为symbol to proc,它创建一个proc对象,map将数组的每个元素都生成

所以上面的例子可以改写如下:

lambda_obj = ->(ele) { ele.first }
ary.chunk {|x| x }.map(&lambda_obj)

#=> ["One", "Two", "One", "Three", "One"]

答案 1 :(得分:2)

使用inject非常简单:

ary.inject [] do |accum,x|
  accum.last == x ? accum : accum << x  
end