如果在数组合并期间找到类似值,则拒绝或删除Ruby数组

时间:2011-11-12 15:11:58

标签: ruby

如果存在类似的值,如何删除早期的数组值?这是我使用的代码:

def address_geo
    arr = []
    arr << do if do
    arr << re if re
    arr << me if me
    arr << fa if fa
    arr << so if so
    arr << la if la
    arr.reject{|y|y==''}.join(' ')
end

给出以下值

do = 'I'
re = 'am'
me = 'a'
fa = 'good'
so = 'good'
la = 'boy'

上述方法将产生:

I am a good good boy

我应该如何编写数组合并以拒绝fa,只需要so来产生:

I am a good boy

非常感谢!

2 个答案:

答案 0 :(得分:4)

您可以使用Array#uniq

> arr = ['good', 'good']
> arr.uniq
=> ['good']

根据@ tokland的建议,如果你只想删除连续的重复项,这将有效(并支持ruby 1.8)。通过使用inject构建新数组,我们可以过滤掉empty?或与前一个字符串相同的每个字符串。

> %w(a good good boy).inject([]) do |mem, str|
>   mem << str if !str.empty? && mem[-1] != str
>   mem
> end
=> ['a', 'good', 'boy']

答案 1 :(得分:1)

您可以使用Enumerable#chunk删除数组中的连续元素:

strings = ["hi", "there", "there", "hi", "bye"].select { |x| x && !x.empty? }
strings.chunk { |x| x }.map(&:first).join(" ")
#=> "hi there hi bye"