查找数组数组中元素的索引

时间:2016-02-26 14:52:29

标签: arrays ruby indexing find

我有一个数组数组:

[
  [0,0,0,0],
  [0,1,0,0],
  [0,0,0,1],
  [0,0,0,0]
]

我想找到值为1的项目的索引(行和列)。我怎样才能做到这一点?我需要这些值,以便我可以操纵1两侧的单元格。我查看了find.index方法,但我不确定。

5 个答案:

答案 0 :(得分:3)

不那么花哨,但你可以使用两个循环:

ary = [
  [0, 0, 0, 0],
  [0, 1, 0, 0],
  [0, 0, 0, 1],
  [0, 0, 0, 0]
]

result = []
ary.each_with_index do |row, i|
  row.each_with_index do |value, j|
    result << [i, j] if value == 1
  end
end
result
#=> [[1, 1], [2, 3]]

答案 1 :(得分:2)

a = [
  [0,0,0,0],
  [0,1,0,0],
  [0,0,0,1],
  [0,0,0,0]
].flatten

a.each.with_index.select{|e, _| e == 1}.map{|_, i| i.divmod(4)}
# => [[1, 1], [2, 3]]

被解释为(第1行,第1列)和(第2行,第3列)。

答案 2 :(得分:1)

考虑使用Matrix类。

require 'matrix'

arr = [
  [0, 0, 0, 0],
  [0, 1, 0, 0],
  [0, 0, 0, 1],
  [0, 0, 0, 0]
]    

target = 1

Matrix[*arr].each_with_index.with_object([]) { |(e,row,col),a|
  a << [row,col] if e==target }
  #=> [[1, 1], [2, 3]]

我喜欢这样读。

答案 3 :(得分:0)

Ruby有一个非常灵活的功能样式Enumerable模块,它包含在许多标准集合(数组,散列,集合)中。您可以找到文档at ruby-doc.org

在max #rows * 2 #columns时间内解决此问题的一个很好的单行程如下:

matrix
  .each.with_index
  .inject([]) { |acc, (el,idx)| el.include?(1) ? acc.push([idx, el.index(1)]) : acc }
# => [[1,1],[2,3]]

答案 4 :(得分:0)

z = [
  [0,0,0,0],
  [0,1,0,0],
  [0,0,0,1],
  [0,0,0,0]
]

首先,让我们找到匹配的行:

rows = z.each_with_index.select { |row, index| row.include? 1}.map(&:last)
# => [1, 2]

然后对于每一行,让我们找到匹配的1

的索引
cols = rows.map {|row| z[row].each_with_index.select { |item, index| item == 1}.map(&:last) }
# => [[1], [3]]

如果需要,我们可以使用zip

组合它们
rows.zip(cols)
# => [[1, [1]], [2, [3]]]

即使z的一行包含多次出现1

,上述情况仍然有效

例如,如果我们有:

z = [
  [1,0,0,1],
  [0,1,0,0],
  [0,0,0,1],
  [1,1,1,0]
]

然后

rows = z.each_with_index.select { |row, index| row.include? 1}.map(&:last)
# => [0, 1, 2, 3]
cols = rows.map {|row| z[row].each_with_index.select { |item, index| item == 1}.map(&:last) }
# => [[0, 3], [1], [3], [0, 1, 2]]
rows.zip(cols)
# => [[0, [0, 3]], [1, [1]], [2, [3]], [3, [0, 1, 2]]]