Ruby 检查子数组中的所有项是否相同
正在尝试检查子数组中的所有项是否相同。例如,我有一个5x5板,我想知道其中一个阵列是否包含所有Ruby 检查子数组中的所有项是否相同,ruby,arrays,sub-array,Ruby,Arrays,Sub Array,正在尝试检查子数组中的所有项是否相同。例如,我有一个5x5板,我想知道其中一个阵列是否包含所有x的: 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]] 我目前有: de
x的
:
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
,而不是全部。任何建议都将不胜感激。只要board.map{| row | row.uniq.count==1}
就可以了#=>[假,真,假,假,假]
返回数组中唯一的元素<代码>映射这里迭代数组,每次向块传递一行。如果数组中的所有元素都相同(['x',x','x','x','x','x']),则返回true
,长度为1的uniq#=>['x']
)
如果您只想检查板中的任何行是否有所有重复的元素,ruby只有一个函数。你猜怎么着。只需使用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.
纯红宝石般的迷人气质。更地道一点:
董事会1号?{| row | row.all?{| item | item=='x'}
如果数组中的所有元素都相同,则表示最大值和最小值相等。
对于您的电路板,您可以通过这一行找到所需子阵列的索引
board.each {|b| puts board.index(b) if b.max == b.min}
或者将函数中的
x.include?(“x”)
替换为x.min==x.max
,以获得真/假结果假设板的所有元素(板的行)大小相同,这似乎是一个合理的假设,您可以这样做:
x_row = ['x']*board.first.size
#=> ["x", "x", "x", "x", "x"]
board.any? { |row| row == x_row }
#=> true
假设它始终是一个固定长度的数组,则您的方法可以是:
def full_row
board.each do |row|
return true if (row.uniq.count == 1) && (row[0] == 'x')
end
return false
end
这可以归结为更少的行,但我讨厌vim中的换行:p添加了更多的信息来使用Ruby数组。当我在只有一个“x”的板上运行时,这似乎不起作用。如果数组中的所有项都是“x”,那么它仍然返回为true。在这种情况下,您能给出有问题的板对象吗?未完全理解该场景。请注意,如果该行全部填充了1
或任何其他相同的值,uniq
仍将返回true
,即使它不是x
。@ma_li:Travis声明“如果子数组中的所有项都相同”,我不认为他只是希望x
在那里检查副本x
只是一个例子。有趣的是,我已经尝试了这两种解决方案。然而,当尝试@kiddorails解决方案时,如果只有一个“x”,则输出仍然为true,如果所有的都是“x”,则我需要它为true。我确实使用了board.one?
,这确实有效。尽管我对.one?
的工作原理并不熟悉。可枚举的#one?
获取容器中的每个条目并将其传递给给定的块。如果仅对一条记录,块的计算结果为true
,则整个方法返回true
。如果严格要求一行包含所有“x”,则保留one?
。否则,请使用any?
,这意味着如果一行电路板是[1,'x']
,[1,'x'],则至少有一行都是“x”。max#=>ArgumentError:字符串与1的比较失败
@CarySwoveland请查看OP中最后一行之前的句子。“但这只会检查其中一个整数是否是x,而不是全部”.倒数第二句?:-)是的,特拉维斯正在解释为什么他的代码不起作用。假设board=[['x',1],'x','x']]
。然后,您的代码返回ArgumentError:Fixnum与String的比较失败
。具体来说,失败的是['x',1].max
。这意味着我完全误解了:)我只是认为x
只是占位符。可以有任何其他整数,对我来说似乎更合理,因为引号,我非常确定'x'
是一个字符串。你的问题表明你正在寻找板
(一排播放板)中包含所有x
的元素,但是你的标题和第一句话建议你寻找board
的一个元素,它的元素都是相同的,但没有任何特定的值。请编辑以澄清行的所有元素必须相同还是必须等于指定的值。如果您不想编辑您的问题以澄清,请礼貌地回答我的评论。