所有索引在嵌套数组Ruby中具有相同的字符

时间:2015-04-27 02:08:32

标签: ruby arrays multidimensional-array

我试图查看索引(例如索引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

2 个答案:

答案 0 :(得分:2)

nested_array.empty? || nested_array.map {|row| row[3]}.uniq.one?

空数组的特殊条件是必要的,因为它们可以轻松地满足为每个元素指定的任何条件,但唯一性测试不会提取它。如果您实际上没有空数组,请随意删除它,否则如果数组为空则测试应该失败。

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

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

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

(如果您希望true[],请再次使用nested_array.empty? || ...作为前缀。

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

答案 1 :(得分:1)

您没有指定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