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

Posted

技术标签:

【中文标题】检查子数组中的所有项目是不是相同 Ruby【英文标题】:Check if all items within sub-array are identical Ruby检查子数组中的所有项目是否相同 Ruby 【发布时间】:2015-07-05 03:54:28 【问题描述】:

尝试检查子数组中的所有项目是否相同。例如,我有一个 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 而不是全部。任何建议将不胜感激。

【问题讨论】:

您的问题表明您正在寻找包含所有xboard(棋盘的一行)的元素,但您的标题和第一句话建议您寻找一个元素board 的元素都相同,但没有任何特定值。请编辑以阐明行的所有元素是否必须相同或必须等于指定值。 如果您不想编辑您的问题来澄清,我会感谢您回复我的评论。 【参考方案1】:

更地道一点:

board.one? |row| row.all? |item| item == 'x'

【讨论】:

有趣的是,我已经尝试了这两种解决方案。但是,在尝试@kiddorails 解决方案时,如果只有一个“x”,输出仍然为真,如果只有一个“x”,我需要它为真。我确实使用了board.one?,并且确实有效。虽然我不熟悉 .one? 的工作原理。 Enumerable#one? 获取容器中的每个条目并将其传递给给定的块。如果对于一条记录,该块的计算结果为 true,则整个方法返回 true 如果您希望严格的一行包含所有“x”,请保留one?。否则使用any?,表示至少有一行全是“x”【参考方案2】:

就像board.map |row| row.uniq.count == 1 一样简单#=> [false, true, false, false, false]

uniq 返回数组中的唯一元素。 map 在这里迭代您的数组并一次将一行传递给块。如果数组中的所有元素都相同(['x', 'x', 'x', 'x', 'x'].uniq #=> ['x'] 长度为 1),它将返回 true

如果您只想检查板中的 any 行是否包含所有重复元素,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 真棒。

【讨论】:

添加了更多关于 Ruby 数组的信息。 当我用只有一个“x”的板子运行它时,这似乎不起作用。当我寻找它时仍然返回为真,如果数组中的所有项目都是'x',则只返回真。 在这种情况下,您能否给出有问题的board 对象?没有完全理解场景。 请注意,如果该行全部填充1 或任何其他相同的值,uniq 仍将返回true,即使它不是x 的。 @ma_li:Travis 声明“如果子数组中的所有项目都相同”,我认为他不只是希望 x 在那里检查重复项。 x 只是一个例子。【参考方案3】:

如果数组中的所有元素都相同,则表示最大值和最小值相等。 对于您的电路板,您可以通过这一行找到所需子阵列的索引

board.each |b| puts board.index(b) if b.max == b.min

或者只是在你的函数中将x.include?("x")替换为x.min == x.max以获得真/假结果

【讨论】:

如果一行板子是[1,'x'],[1,'x'].max #=> ArgumentError: comparison of String with 1 failed. @CarySwoveland 看看 OP 中最后一句之前的句子。 “但这只会检查整数之一是否为 x 而不是全部”。 倒数第二句? :-) 是的,Travis 正在解释为什么他的代码不起作用。假设board = [['x',1],['x','x']]。然后您的代码返回ArgumentError: comparison of Fixnum with String failed。具体来说,是 ['x',1].max 失败了.. 这意味着我完全误解了:) 我只是认为x 只是占位符。可以有任何其他整数,这对我来说似乎更合理 我很确定 'x' 是一个字符串,因为引号。【参考方案4】:

假设board(板的行)的所有元素大小相同,这似乎是一个合理的假设,您可以这样做:

x_row = ['x']*board.first.size
  #=> ["x", "x", "x", "x", "x"] 
board.any?  |row| row == x_row 
  #=> true

【讨论】:

【参考方案5】:

假设它总是一个固定长度的数组,你的方法可以是:

def full_row
  board.each do |row| 
    return true if (row.uniq.count == 1) && (row[0] == 'x')
  end

  return false
end

这可以归结为更少的行,但我讨厌在 vim 中换行:p

【讨论】:

以上是关于检查子数组中的所有项目是不是相同 Ruby的主要内容,如果未能解决你的问题,请参考以下文章

检查多维数组的任何子数组中的特定键是不是存在特定值

有效删除Ruby中数组中其他元素的所有子字符串

在 Presto 中,如何检查我通过子查询获取的列表中是不是存在数组中的元素

比较 Ruby 中二维数组的子数组,并显示结果数组与现有和遗漏的项目

基于创建年份将对象的数组拆分为子数组

Ruby:检查数组中所有对象的属性是不是相等