迭代多维数组以查看子数组的值

时间:2014-09-17 23:10:17

标签: ruby arrays multidimensional-array

我有一个多维数组:

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

2 个答案:

答案 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])