如何使用split对字符串数组进行分组?

时间:2014-03-18 10:35:15

标签: ruby-on-rails ruby ruby-on-rails-3 group-by

嗨我有一个字符串数组

["Facebook_18_2013/03/17_1", "Facebook_17_2013/03/17_1", "Facebook_16_2013/03/17_1", "Facebook_15_2013/03/17_1", "Facebook_14_2013/03/17_1", "Facebook_13_2013/03/17_1", "Facebook_18_2014/03/17_1", "Facebook_17_2014/03/17_1", "Facebook_16_2014/03/17_1", "Facebook_15_2014/03/17_1", "Facebook_14_2014/03/17_1", "Facebook_13_2014/03/17_1", "Facebook_18_2015/03/17_1", "Facebook_17_2015/03/17_1", "Facebook_16_2015/03/17_1", "Facebook_15_2015/03/17_1", "Facebook_14_2015/03/17_1", "Facebook_13_2015/03/17_1","Facebook_18_2013/04/12_1", "Facebook_17_2013/05/11_1", "Facebook_16_2013/05/01_1", "Facebook_15_2013/04/03_1", "Facebook_14_2013/06/03_1", "Facebook_13_2013/06/15_1"]

从这个数组中我想用日期,年份,月份对字符串进行分组。

预期输出

{"2013/03"=>["Facebook_18_2013/03/17_1", "Facebook_17_2013/03/17_1", "Facebook_16_2013/03/17_1", "Facebook_15_2013/03/17_1", "Facebook_14_2013/03/17_1", "Facebook_13_2013/03/17_1"],"2013/04"=>["Facebook_18_2013/04/17_1", "Facebook_17_2013/04/17_1", "Facebook_16_2013/04/17_1", "Facebook_15_2013/04/17_1", "Facebook_14_2013/04/17_1", "Facebook_13_2013/04/17_1"], "2014/03"=>["Facebook_18_2014/03/17_1", "Facebook_17_2014/03/17_1", "Facebook_16_2014/03/17_1", "Facebook_15_2014/03/17_1", "Facebook_14_2014/03/17_1", "Facebook_13_2014/03/17_1"], "2015/03"=>["Facebook_18_2015/03/17_1", "Facebook_17_2015/03/17_1", "Facebook_16_2015/03/17_1", "Facebook_15_2015/03/17_1", "Facebook_14_2015/03/17_1", "Facebook_13_2015/03/17_1"]}

我使用以下ruby代码根据年份进行分组

a.flatten.uniq.group_by{|x| x.split("_")[3].split("/")[0]}

那我怎么能用飞蛾做这一年(例如:2013/04)?

2 个答案:

答案 0 :(得分:1)

请按以下步骤操作:

a = [
      "Facebook_18_2013/03/17_1", "Facebook_17_2013/03/17_1", 
      "Facebook_16_2013/03/17_1","Facebook_15_2013/03/17_1", 
      "Facebook_14_2013/03/17_1", "Facebook_13_2013/03/17_1", 
      "Facebook_18_2014/03/17_1", "Facebook_17_2014/03/17_1", 
      "Facebook_16_2014/03/17_1" 
    ]

a.group_by { |s| s[/Facebook_\d+_(\d+\/\d+)\/\d+_\d+/,1] }

# => {"2013/03"=>["Facebook_18_2013/03/17_1", "Facebook_17_2013/03/17_1", 
# "Facebook_16_2013/03/17_1", "Facebook_15_2013/03/17_1", 
# "Facebook_14_2013/03/17_1", "Facebook_13_2013/03/17_1"], 
# "2014/03"=>["Facebook_18_2014/03/17_1", "Facebook_17_2014/03/17_1"
# , "Facebook_16_2014/03/17_1"]}

答案 1 :(得分:1)

由于这里仅关注年,/和月,\d有点贵,所以解决方案也可以这样写:

a = [
      "Facebook_18_2013/03/17_1", "Facebook_17_2013/03/17_1", 
      "Facebook_16_2013/03/17_1", "Facebook_15_2013/03/17_1", 
      "Facebook_14_2013/03/17_1", "Facebook_13_2013/03/17_1", 
      "Facebook_18_2014/03/17_1", "Facebook_17_2014/03/17_1", 
      "Facebook_16_2014/03/17_1", "Facebook_15_2014/03/17_1", 
      "Facebook_14_2014/03/17_1", "Facebook_13_2014/03/17_1", 
      "Facebook_18_2015/03/17_1", "Facebook_17_2015/03/17_1", 
      "Facebook_16_2015/03/17_1", "Facebook_15_2015/03/17_1", 
      "Facebook_14_2015/03/17_1", "Facebook_13_2015/03/17_1", 
      "Facebook_18_2013/04/12_1", "Facebook_17_2013/05/11_1", 
      "Facebook_16_2013/05/01_1", "Facebook_15_2013/04/03_1", 
      "Facebook_14_2013/06/03_1", "Facebook_13_2013/06/15_1"
    ]

a.group_by { |s| s[/([0-9]{4}\/[0-9]{2})/,1] }

#{
#  "2013/03"=>["Facebook_18_2013/03/17_1", "Facebook_17_2013/03/17_1", "Facebook_16_2013/03/17_1", "Facebook_15_2013/03/17_1", "Facebook_14_2013/03/17_1", "Facebook_13_2013/03/17_1"], 
#  "2014/03"=>["Facebook_18_2014/03/17_1", "Facebook_17_2014/03/17_1", "Facebook_16_2014/03/17_1", "Facebook_15_2014/03/17_1", "Facebook_14_2014/03/17_1", "Facebook_13_2014/03/17_1"], 
#  "2015/03"=>["Facebook_18_2015/03/17_1", "Facebook_17_2015/03/17_1", "Facebook_16_2015/03/17_1", "Facebook_15_2015/03/17_1", "Facebook_14_2015/03/17_1", "Facebook_13_2015/03/17_1"], 
#  "2013/04"=>["Facebook_18_2013/04/12_1", "Facebook_15_2013/04/03_1"], 
#  "2013/05"=>["Facebook_17_2013/05/11_1", "Facebook_16_2013/05/01_1"], 
#  "2013/06"=>["Facebook_14_2013/06/03_1", "Facebook_13_2013/06/15_1"]
#}

这有点快。