尝试检查子阵列中的所有项目是否相同。例如,我有一个5x5电路板,我想知道其中一个数组是否包含所有x's
:
board = [[47, 44, 71, 8, 88],
['x', 'x', 'x', 'x', 'x'],
# [83, 85, 97, 'x', 57],
[83, 85, 97, 89, 57],
[25, 31, 96, 68, 51],
[75, 70, 54, 80, 83]]
我目前有:
def check_x
board.each do |x|
return true if x.include?('x')
end
return false
end
但这只会检查其中一个整数是x
而不是全部。任何建议都将不胜感激。
答案 0 :(得分:6)
有点习惯:
board.one? { |row| row.all? { |item| item == 'x' } }
答案 1 :(得分:2)
就像board.map { |row| row.uniq.count == 1 }
一样简单
#=> [false, true, false, false, false]
uniq
返回数组中的唯一元素。 map
这里迭代你的数组并一次传递一行到块。对于数组中所有元素相同(true
长度为1)的情况,它将返回['x', 'x', 'x', 'x', 'x'].uniq #=> ['x']
如果您只是想检查板上的任何行是否包含所有重复元素,那么ruby只有一个功能。你猜怎么着? any?
。只需将any?
改为高于单行,即:
board.any? { |row| row.uniq.count == 1 } #=> true
如果你想知道哪一行有/所有重复项,以及它有什么重复:
board.each.with_index.select { |row, index| row.uniq.count == 1 }
#=> [[["x", "x", "x", "x", "x"], 1]], where 1 is index.
纯Ruby非常棒。
答案 2 :(得分:0)
如果数组中的所有元素都相同,则表示最大值和最小值相等。 对于您的电路板,您可以使用此一行找到所需子阵列的索引
board.each {|b| puts board.index(b) if b.max == b.min}
或者只是将x.include?("x")
替换为函数中的x.min == x.max
,以获取真/假结果
答案 3 :(得分:0)
假设board
的所有元素(板的行)都是相同的大小,这似乎是一个合理的假设,你可以这样做:
x_row = ['x']*board.first.size
#=> ["x", "x", "x", "x", "x"]
board.any? { |row| row == x_row }
#=> true
答案 4 :(得分:0)
假设它总是一个固定长度的数组,你的方法可以是:
def full_row
board.each do |row|
return true if (row.uniq.count == 1) && (row[0] == 'x')
end
return false
end
这可以归结为更少的行,但我讨厌vim中的换行:p