我有一个数组
array = [ "mm,GATO,nn", "mm,GATO,nn",
"mm,PERRO,nn", "mm,PERRO,nn",
"mm,LOBO,nn", "mm,LOBO,nn" ]
我需要使用each_index
来获取
array = [ "mm,GATO,nn1", "mm,GATO,nn2",
"mm,PERRO,nn1", "mm,PERRO,nn2",
"mm,LOBO,nn1", "mm,LOBO,nn2" ]
请帮助我。
答案 0 :(得分:2)
您只是为重复的字符串编号吗?在这种情况下,您可以使用计数器哈希:
array = ["mm,GATO,nn","mm,GATO,nn","mm,PERRO,nn","mm,PERRO,nn","mm,LOBO,nn","mm,LOBO,nn"]
counter = Hash.new(0)
array.map! do |word|
word + (counter[word] += 1).to_s
end
p array
# ["mm,GATO,nn1", "mm,GATO,nn2", "mm,PERRO,nn1", "mm,PERRO,nn2", "mm,LOBO,nn1", "mm,LOBO,nn2"]
如果由于某种原因你真的想使用each_index
并且你确定你总是有双字:
array.each_index do |i|
array[i] << (i % 2 + 1).to_s
end
答案 1 :(得分:1)
num = "1"
array.each_with_index do |string, index|
array[index] = string + num
num = num == "1" ? "2" : "1"
end
答案 2 :(得分:1)
由于所有偶数索引元素都需要&#34; 1&#34;并且所有奇数元素都需要&#34; 2&#34;,我会制作一个将均匀度映射到&#34; 1&#34;和#34; 2&#34;的奇怪,然后映射数组#with_index
,附加每个元素的正确值。
index_is_even = { true => "1", false => "2" }
array.map.with_index { |el, i| el + index_is_even[i % 2 == 0] }
答案 3 :(得分:0)
如果你有相同单词长度和顺序未知的组,你可以这样做:
> array.group_by {|e| e}.values.map{|a| a.map.with_index(1) {|w, i| w << i.to_s}}.flatten
["mm,GATO,nn1", "mm,GATO,nn2", "mm,PERRO,nn1", "mm,PERRO,nn2", "mm,LOBO,nn1", "mm,LOBO,nn2"]
这将修改array
。如果你想要一个新阵列,你可以这样做:
> array.group_by {|e| e}.values.map{|ar| ar.map.with_index(1) {|w, i| "%s%i" % [w, i] }}.flatten
如果你知道你的目标词只是有序对,你也可以这样做:
> array.each_slice(2).map{|l| l.zip(['1','2']).map(&:join)}.flatten
["mm,GATO,nn1", "mm,GATO,nn2", "mm,PERRO,nn1", "mm,PERRO,nn2", "mm,LOBO,nn1", "mm,LOBO,nn2"]