52ky 发表于 2022-5-4 15:24:23

如何获取数组元素的序列?

问题
我有一个由“块”分隔的数组。每个不可见块都以一个数字 5 的字母开始,并在另一个数字 5 的字母出现时结束。
a = [
   "F5","a4","g4","F5","a4","d4","F5","a4","g4","e3",
   "H5","a4",
   "Y5","a4","d4","Y5","g4","c3"
   ]
在这个数组中,有 3 个“块”。如下所示。

我想要得到的是每个块(不是数组本身)中每个元素的序列(从 1 到 N),其中输出是:
b = [
    ["F5",1],["a4",1],["g4",1],["F5",2],["a4",2],["d4",1],["F5",3],["a4",3],["g4",2],["e3",1],
    ["H5",1],["a4",1],
    ["Y5",1],["a4",1],["d4",1],["Y5",2],["g4",1],["c3",1]
    ]
在我目前的尝试中,我只得到每个元素的计数,而不是序列。如何做呢?谢谢
a = [
   "F5","a4","g4","F5","a4","d4","F5","a4","g4","e3",
   "H5","a4",
   "Y5","a4","d4","Y5","g4","c3"
   ]

b = []

a.each{|v|
    b.push()
}

=> [
    ["F5", 3], ["a4", 5], ["g4", 3], ["F5", 3], ["a4", 5], ["d4", 2], ["F5", 3], ["a4", 5], ["g4", 3], ["e3", 1],
    ["H5", 1], ["a4", 5],
    ["Y5", 2], ["a4", 5], ["d4", 2], ["Y5", 2], ["g4", 3], ["c3", 1]
    ]
回答
我们得到数组
a = ["F5","a4","g4","F5","a4","d4","F5","a4","g4","e3",
   "H5","a4","Y5","a4","d4","Y5","g4","c3"]
这个问题可以看成有两个步骤,第一个是将a转换为
arr = [["F5","a4","g4","F5","a4","d4","F5","a4","g4","e3"],
       ["H5","a4"], ["Y5","a4","d4","Y5","g4","c3"]]
第二步是从 arr 构造所需的数组。

第1步

我了解将 a 转换为 arr 的规则如下。

arr

YZ

/\d/

5

一种

b

arr

一种

一种

一种

一种

b

/\d/

b

我们可以写
frst = a.first
arr = a.slice_before do |s|
(s.match?(//) && s != frst && s == frst) ?
    (frst = s) : false
end.to_a
#=> [["F5", "a4", "g4", "F5", "a4", "d4", "F5", "a4", "g4", "e3"]],
#    ["H5", "a4"], ["Y5", "a4", "d4", "Y5", "g4", "c3"]]
请参阅前面的可枚举切片。

第2步

我们现在可以将 arr 转换为所需的数组,如下所示。
arr.map do |e|
h = Hash.new(0)
e.map { |s| += 1] }
end
#=> [[["F5", 1], ["a4", 1], ["g4", 1], ["F5", 2], ["a4", 2], ["d4", 1],
#   ["F5", 3], ["a4", 3], ["g4", 2], ["e3", 1]],
#    [["H5", 1], ["a4", 1]],
#    [["Y5", 1], ["a4", 1], ["d4", 1], ["Y5", 2], ["g4", 1], ["c3", 1]]]
这里 Hash::new 用于创建一个默认值为 0 的空 Hash h。这意味着如果 h 没有键,k 返回零。因为 h 可以看作

h += 1

当 h = h + 1 没有键时,右侧的 h 返回 1 。另一种写法是

H

请参阅哈希提取。



页: [1]
查看完整版本: 如何获取数组元素的序列?