【问题标题】:All indexes having the same character in nested array Ruby嵌套数组Ruby中具有相同字符的所有索引
【发布时间】:2015-04-27 02:08:31
【问题描述】:

我正在尝试查看索引(例如索引 3)是否都具有相同的字符。例如:

nested_array =   [[47, 44, 71, 'x', 88],
                  [22, 69, 75, 'x', 73],
                  [83, 85, 97, 'x', 57],
                  [25, 31, 96, 'x', 51],
                  [75, 70, 54, 'x', 83]]

正如我们所见,索引3 中包含所有x'x 而不是数字。我希望能够验证所有索引是否都有x,如果是,程序返回true。如果除 1 之外的所有都具有x's,它将返回 false。

我现在已经实现了这个条件语句,因为它遍历每个索引以查找大小等于 1 的值。这似乎可以解决问题。

if array.map {|zero| zero[0]}.uniq.size == 1
  return true
elsif array.map {|one| one[1]}.uniq.size == 1
  return true
elsif array.map {|two| two[2]}.uniq.size == 1
  return true
elsif array.map {|three| three[3]}.uniq.size == 1
  return true
elsif array.map {|four| four[4]}.uniq.size == 1
  return true
else
  return false
end

【问题讨论】:

    标签: ruby arrays multidimensional-array


    【解决方案1】:
    nested_array.empty? || nested_array.map {|row| row[3]}.uniq.one?
    

    空数组的特殊条件是必要的,因为它们很容易满足为每个元素指定的任何条件,但唯一性测试不会选择它。如果您实际上没有空数组,请随意删除它,或者如果数组为空,则测试应该失败。

    编辑:似乎我误解了这个问题 - 试试这个作为你的 multi-if 的替代方案:

    nested_array.transpose.any? { |column| column.uniq.one? }
    

    “当你翻转行和列时,是否有任何行(以前是列)只有一个唯一元素?”

    (如果您想将true 替换为[],请再次以nested_array.empty? || ... 为前缀)。

    编辑:感谢 spickermann,将 .size == 1 替换为 .one?。它确实读起来更好。

    【讨论】:

    • 这实际上似乎有效。我确实需要稍微调整一下,并以条件格式对每个索引应用它,如下所示: if array.map {|zero| zero[0]}.uniq.size == 1 返回真 elsif array.map {|one| one[1]}.uniq.size == 1 返回真 elsif array.map {|two| two[2]}.uniq.size == 1 返回真 elsif array.map {|three|三[3]}.uniq.size == 1 返回真 elsif array.map {|four|四[4]}.uniq.size == 1 返回真否则返回假结束
    • 等等,所以你想测试 any 列是否全部相等,而不是特定的一列具有你知道的索引?
    • 例如:Winner = 5 x's 垂直。我想看看我们是否有赢家。所以我遍历每个索引,看看是否在所有相同的索引中找到x,从而完成垂直线。
    • 要使用transpose,您假设nested_array 的所有元素大小相同。是的,他们在示例中,但我们知道是这样吗?如果元素大小不同,当然可以提出这个问题。
    • @spickerman,我同意(并且不知道该方法)。值得一提的是,它是在Enumerable 模块中定义的。我也喜欢Fixnum(我们确实有zero?),但那是另一回事。
    【解决方案2】:

    您没有指定nested_array 的所有元素都必须具有相同的大小,因此我将提供一个没有要求的解决方案:

    nested_array =   [[47, 44, 71, 'x', 88],
                      [75, 70, 54, 'x', 83, 85, 90],
                      [22, 69, 75, 'x', 73],
                      [83, 85, 97, 'x', 57],
                      [25, 31, 96, 'x', 51, 33]]
    
    nested_array.first.zip(*nested_array[1..-1]).any? {|row| row.uniq.size==1}
      #=> true
    

    我们有:

    b = nested_array.first.zip(*nested_array[1..-1])
      #=> [[47, 75, 22, 83, 25],
      #    [44, 70, 69, 85, 31],
      #    [71, 54, 75, 97, 96],
      #    ["x", "x", "x", "x", "x"],
      #    [88, 83, 73, 57, 51]] 
    
    b.any? { |row| row.uniq.size == 1 }
      #=> true
    

    最初,我有:

    nested_array.first.zip(*nested_array[1..-1]).any? {|row|
      row[1..-1].all? { |e| e == row.first } }
    

    而不是{ |row| row.uniq.size==1 }。正如@Amadan 指出的那样,前者应该更快一些。

    如果问题是b 的特定元素是否包含所有相同的值:

    index = 3
    a = nested_array.first.zip(*nested_array[1..-1])
    (index >= a.size) ? false : a[index].uniq.size==1
      #=> true
    

    【讨论】:

    • 不错。此外,大概比uniq 快,即使它读起来不流畅。编辑:然后他去擦掉优化,哈哈。还是 +1
    • @Amadan,我正在编辑更改为uniq,而你说我的速度更快。 :-)
    猜你喜欢
    • 1970-01-01
    • 2021-10-02
    • 2021-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-02
    相关资源
    最近更新 更多