我有以下数组:
input_array = ["aa", "aa", "--", "--", "--", "aa", "--", "--"]
如何在上面的示例中将“ aa”值替换为递增的数字?类似于以下结果:
output_array = [1, 2, "--", "--", "--", 3, "--", "--"]
我正在尝试维护一个计数器,然后为给定的密钥循环多次:
这可行,但是我在寻找是否存在更好的方法来解决这个问题-
a = ["-W-", "-C-", "-A-", "-A-", "-W-", "-W-", "-C-", "-A-", "-A-", "-W-", "---", "---", "---", "-A-", "-W-"]
counts = {"-A-"=>0, "-C-"=>0, "-W-"=>0, "---"=>0 }
a.each { |e| counts[e] += 1 }
counter = 1
counts.each do |key, value|
ax = a.each_index.select{ |i| a[i] == key }
ax.each_with_index do |ss, si|
a[ss] = counter
counter += 1
end
end
p a
答案 0 :(得分:0)
一个可能的选项,使用Array#slice
和Enumerable#each_with_index
对切片数组的出现进行计数:
ary = ["aa", "aa", "--", "--", "--", "aa", "--", "--", "aa"]
ary.map.with_index { |e, i| e == "aa" ? ary[0..i].count("aa") : e }
#=> [1, 2, "--", "--", "--", 3, "--", "--", 4]
Enumerable#group_by
然后Hash#transform_values
:
a = ["-W-", "-C-", "-A-", "-A-", "-W-", "-W-", "-C-", "-A-", "-A-", "-W-", "---", "---", "---", "-A-", "-W-"]
a.group_by { |e| e }.transform_values { |v| v.size }
#=> {"-W-"=>5, "-C-"=>2, "-A-"=>5, "---"=>3}