我有一个多维数组:
winning_lines = [[1,4,7],[2,5,8],[3,6,9],[1,5,9],[3,5,7],[1,2,3],[4,5,6],[7,8,9]]
我想看看第二级数组中的任何值是'X'
,'X'
,'X'
。我有这个代码,这是错误的,因为它不会返回"player"
:
if g[line[0..7].any?] == ['X','X','X']
return 'Player'
end
我应该如何检查任何子阵列中的所有值是否为X
?
答案 0 :(得分:1)
您可以使用include?():
return 'Player' if winning_lines.include?(['X', 'X', 'X'])
但使用集合可能更有效:
require 'set'
winning_lines = Set.new([[1,4,7],[2,5,8],[3,6,9],[1,5,9],[3,5,7],[1,2,3],[4,5,6],[7,8,9]])
...
return 'Player' if winning_lines.include?(['X', 'X', 'X'])
当子阵列不存在时, Array#include?()
要求ruby搜索整个数组,并且当子数组存在时,ruby将不得不平均搜索一半数组。对于每个子阵列,ruby必须对子阵列中的项目与['X','X','X']中的项进行一些比较,以确定它们是否相等。另一方面,Set#include?()
就像在Hash中查找一个键:无论集合有多大,ruby都可以立即确定该项是否存在于集合中。
答案 1 :(得分:0)
要按字面意思做你要求的,你可以这样做:
winning_lines.any?{|a| a.all?{|e| e == "X"}}
但是调查这个子阵列是premature optimization。在子数组中只有三个元素,并且您不需要避免在代码中仅重复写入三次"X"
。
winning_lines.any?{|a| a == %w[X X X]}
会这样做。或者,您可以执行7stud建议的操作,但index
实际上比include?
更快,尽管它提供了更多信息。
winning_lines.index(%w[X X X])