Как изменить этот массив? - PullRequest
0 голосов
/ 01 февраля 2019

У меня есть следующий массив:

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 голосов
/ 02 февраля 2019

Один из возможных вариантов, подсчет появления врезанного массива с использованием 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}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...