我如何使用`each_index`打印每个元素的索引?

时间:2017-07-14 15:39:30

标签: arrays ruby string indexing

我有一个数组

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"  ]

请帮助我。

4 个答案:

答案 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"]