我有一个数组数组:
[
[0,0,0,0],
[0,1,0,0],
[0,0,0,1],
[0,0,0,0]
]
我想找到值为1
的项目的索引(行和列)。我怎样才能做到这一点?我需要这些值,以便我可以操纵1
两侧的单元格。我查看了find.index
方法,但我不确定。
答案 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]]]