映射数组中与特定值匹配的值的索引?

时间:2015-04-14 16:33:32

标签: ruby-on-rails ruby arrays

免责声明,我是初学者。

我有一个16位数的数组,限制为0和1。我正在尝试创建一个新数组,其中只包含原始数组中1的索引值。

我目前有:

one_pos = []
    image_flat.each do |x| 
        if x == 1 
            p = image_flat.index(x)
            one_pos << p
            image_flat.at(p).replace(0)
        end
    end

image_flat数组为[0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0]

使用上面的代码,one_pos返回[3,3]而不是我期望的[3,5]。

我哪里错了?

4 个答案:

答案 0 :(得分:6)

  

我哪里错了?

致电时

image_flat.index(x)

它只返回image_flat数组中x的第一个条目。

我想有一些更好的解决方案,比如这个:

image_flat.each_with_index do |v, i|
  one_pos << i if v == 1
end

答案 1 :(得分:2)

尝试在阵列上使用each_with_index(http://apidock.com/ruby/Enumerable/each_with_index)。

image_flat = [0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

one_pos = []
image_flat.each_with_index do |value, index| 
  if value == 1 
    one_pos << index
  end
end

答案 2 :(得分:2)

我认为这是最优雅的解决方案:

image_flat.each_index.select{|i| image_flat[i] == 1}

答案 3 :(得分:0)

这是一个解决方案,如果您正在寻找一个虽然需要链式解决方案但不会超出可枚举块的解决方案。

image_flat.each_with_index.select { |im,i| im==1 }.map { |arr| arr[1] }

它被链接起来,将需要进行额外的查找,因此Gena Shumilkin的答案对于较大的阵列可能更为最佳。

这是我本来以为Gena Shumilkin想要达到的目标,直到我意识到解决方案使用each_index而不是each_with_index。