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