我是Ruby的新手,这是我的问题:我想迭代一个Array或String来获取与Regex匹配的字符索引。
示例数组/字符串
a = %q(A B A A C C B D A D)
b = %w(A B A A C C B D A D)
我需要的是变量a或b之类的东西;
#index of A returns;
[0, 2, 3,8]
#index of B returns
[1,6]
#index of C returns
[5,6]
#etc
我已经尝试过狡猾了
z = %w()
a =~ /\w/.each_with_index do |x, y|
puts z < y
end
但是,这并没有很好的锻炼。
任何解决方案?
答案 0 :(得分:3)
对于数组,您可以使用
b.each_index.select { |i| b[i] == 'A' }
对于字符串,您可以先将其拆分为数组(a.split(/\s/)
)。
答案 1 :(得分:1)
如果您希望将每个字符的索引作为哈希值,则可以使用:
b = %w(A B A A C C B D A D)
h = {}
b.each_with_index { |e, i|
h[e] ||= []
h[e] << i
}
h
#=> {"A"=>[0, 2, 3, 8], "B"=>[1, 6], "C"=>[4, 5], "D"=>[7, 9]}
或作为&#34;单行&#34;:
b.each_with_object({}).with_index { |(e, h), i| (h[e] ||= []) << i }
#=> {"A"=>[0, 2, 3, 8], "B"=>[1, 6], "C"=>[4, 5], "D"=>[7, 9]}
答案 2 :(得分:0)
如果要计算每个字母的出现次数,可以定义辅助方法:
def occurrences(collection)
collection = collection.split(/\s/) if collection.is_a? String
collection.uniq.inject({}) do |result, letter|
result[letter] = collection.each_index.select { |index| collection[index] == letter }
result
end
end
# And use it like this. This will return you a hash something like this:
# {"A"=>[0, 2, 3, 8], "B"=>[1, 6], "C"=>[4, 5], "D"=>[7, 9]}
occurrences(a)
occurrences(b)
这应该适用于String或Array。