Ruby 检查子数组中的所有项是否相同

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

正在尝试检查子数组中的所有项是否相同。例如,我有一个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]]
我目前有:

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
的一个元素,它的元素都是相同的,但没有任何特定的值。请编辑以澄清行的所有元素必须相同还是必须等于指定的值。如果您不想编辑您的问题以澄清,请礼貌地回答我的评论。