如何修改此数组?

时间:2019-02-01 13:14:14

标签: ruby-on-rails ruby

我有以下数组:

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

1 个答案:

答案 0 :(得分:0)

一个可能的选项,使用Array#sliceEnumerable#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}