带有动态元素的Ruby数组group_by

时间:2014-04-10 02:02:42

标签: ruby arrays dynamic group-by

array = ["a > 1 2 3", "a > 4 5 6", "a > 7 8 9", "b > 1 2 3", "b > 4 5 6", "b > 7 8 9", "b > 10 11 12"]

我正在尝试按字符串的起始值对数组进行分组/拆分。我知道如果元素是静态的,我可以使用group_by ...

array.group_by{|t| t[0]}.values

array = [["a > 1 2 3", "a > 4 5 6", "a > 7 8 9"], ["b > 1 2 3", "b > 4 5 6", "b > 7 8 9", "b > 10 11 12"]]

但是“>”之前的任何内容都是动态的,所以我不知道如何“匹配”'a','b'是打包来分组。

2 个答案:

答案 0 :(得分:2)

你可以这样做:

array.group_by { |t| t.split(/\s*>\s*/).first }.values

答案 1 :(得分:1)

这是你可以做到的另一种方式:

<强>代码

array.sort.chunk { |str| str[/^[a-z]+\s>/] }.map(&:last)

<强>解释

array = ["a > 1 2 3", "a > 4 5 6", "a > 7 8 9", "b > 1 2 3",
         "b > 4 5 6", "b > 7 8 9", "b > 10 11 12"]
a = array.sort
  #=> ["a > 1 2 3", "a > 4 5 6", "a > 7 8 9",
  #    "b > 1 2 3", "b > 10 11 12", "b > 4 5 6", "b > 7 8 9"]
enum = a.chunk { |str| str[/^[a-z]+\s>/] }
  #=> #<Enumerator: #<Enumerator::Generator:0x0000010304ee40>:each>

查看枚举器enum的内容:

enum.to_a
  #=> [["a >", ["a > 1 2 3", "a > 4 5 6", "a > 7 8 9"]],
  #    ["b >", ["b > 1 2 3", "b > 10 11 12", "b > 4 5 6", "b > 7 8 9"]]]

enum.map(&:last)
  #=> [["a > 1 2 3", "a > 4 5 6", "a > 7 8 9"],
  #    ["b > 1 2 3", "b > 10 11 12", "b > 4 5 6", "b > 7 8 9"]]
相关问题