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'是打包来分组。
答案 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"]]