删除重复项并删除数组中不需要的字符串

时间:2014-01-29 03:42:21

标签: ruby

我有一个看起来像这样的数组

@arr_sh = ['JAN 28, 2014','JAN 21, 2014', 'RATE THIS MOVIE', 'MOVIE INFO', 'WATCH IT NOW', 'JAN 14, 2014', 'RATE THIS MOVIE', 'MOVIE INFO', 'WATCH IT NOW', 'JAN 7, 2014', 'RATE THIS MOVIE', 'MOVIE INFO', 'WATCH IT NOW', 'DEC 31, 2013', 'DEC 24, 2013', 'DEC 17, 2013', 'RATE THIS MOVIE', 'MOVIE INFO', 'WATCH IT NOW']

正如你所看到的那样有重复的数据'评价这部电影','电影信息','现在观看'

我尝试了@arr_sh.uni q,但我仍然看到重复值。

问题是 1.如何消除此数组中的重复项 2.然后我想创建一个单独的数组,其中只包含来自此数组@arr_sh的日期值。所以新数组应该看起来像

@arr_date =  ['JAN 28, 2014','JAN 21, 2014', 'JAN 14, 2014', 'JAN 7, 2014', 'DEC 31, 2013', 'DEC 24, 2013', 'DEC 17, 2013']

我正在使用Ruby 1.9.3

4 个答案:

答案 0 :(得分:1)

首先,如果要在适当的位置改变数组,则需要使用.uniq!。您可以使用Date类来解析日期(mudasobwa的建议)

irb(main):007:0> @arr_sh.uniq.select {|v| Date.parse(v) rescue false}
=> ["JAN 28, 2014", "JAN 21, 2014", "JAN 14, 2014", "JAN 7, 2014", "DEC 31, 2013", "DEC 24, 2013", "DEC 17, 2013"]
irb(main):008:0> new_arr = @arr_sh.uniq.select {|v| Date.parse(v) rescue false}
=> ["JAN 28, 2014", "JAN 21, 2014", "JAN 14, 2014", "JAN 7, 2014", "DEC 31, 2013", "DEC 24, 2013", "DEC 17, 2013"]

答案 1 :(得分:0)

要完全删除重复项(不是包含特定内容的值),只需使用代码:

@arr_sh.select{ |v| @arr_sh.select{|u| u == v }.size == 1 }
# => ["JAN 28, 2014", "JAN 21, 2014", "JAN 14, 2014", "JAN 7, 2014", "DEC 31, 2013", "DEC 24, 2013", "DEC 17, 2013"]

答案 2 :(得分:0)

这完成了你想要的简洁:

@arr_date = @arr_sh.uniq!.select{|str| str =~ /\A[A-Z]{3} \d{2}, \d{4}\z/ }

哪个收益

p @arr_sh
#=> ["JAN 28, 2014", "JAN 21, 2014", "RATE THIS MOVIE", "MOVIE INFO", "WATCH IT NOW", "JAN 14, 2014", "JAN 7, 2014", "DEC 31, 2013", "DEC 24, 2013", "DEC 17, 2013"]

p @arr_date
#=> ["JAN 28, 2014", "JAN 21, 2014", "JAN 14, 2014", "DEC 31, 2013", "DEC 24, 2013", "DEC 17, 2013"]

答案 3 :(得分:0)

编辑:@ snowe2010指出我的回答与他早先发布的回答非常相似。这是真的,我为没有提到这一点而道歉,但在我的辩护中,我不知何故忽略了他的答案。然而,我会离开我,因为我的一些言论可能对napsterdsilva有用,napsterdsilva可能是Ruby的新手。

我认为你需要做这样的事情来提取日期而不是别的:

require 'date'  

dates = @arr_sh.select do |str|  
  begin
    Date.strptime(str, '%b %d, %Y')
    true
  rescue ArgumentError
    false
  end
end
dates # => ["JAN 28, 2014", "JAN 21, 2014", "JAN 14, 2014", "JAN 7, 2014",
      #     "DEC 31, 2013", "DEC 24, 2013", "DEC 17, 2013"]

不幸的是,Ruby没有方法is_a_date?(str, '%b %d, %Y')。相反,你只需要让Date#strptime在窒息时引发异常。如果strptime返回日期对象,则会执行true并返回select;否则会引发ArgumenError,由救援条款捕获,false将返回select,然后返回到下一个str对象。

这将拒绝“我的狗被命名为Diva”,但它也将拒绝“2014年1月99日”和“2014年2月29日”,这可能会更简单的过滤器。它也会拒绝你可能不想要的“2014年1月28日”,但在这种情况下你可能需要首先确保所有日期都有一个共同的格式。

你可能认为这是一个非常麻烦的事情,只是为了确保一个字符串是一个日期。是的,这很痛苦,但我认为在生产环境中会出现这样的情况,在这种情况下,避免过滤器的非日期成本可能非常高。

您可能需要考虑存储日期对象而不是日期字符串。这样可以轻松操作和比较日期。您的问题将简化为:

dates = @arr_sh.select { |e| e.class == Date }
相关问题