2014-12-02 67 views
0

我正在编写一个程序,需要检查二维数组的每列中的值是否相等。列数也是静态的,为五。如何测试列中的所有项目是否相同

目前,我有一个if语句从列迭代列在一个巨大的检查比较所有的值在该列:

if column[0][i] == column[1][i] && column[0][i] == column[2][i] 

编辑:对不起,我不打算的混乱。阵列创建一个5x5的游戏板。行是指每个单独的数组,列是指每个数组中的第n位数字。

+0

你的代码看起来像是在比较“行”中的每个值 - 尽管哪些是“列”,哪些是“行”是有争议的。你能用一个简单的例子来说明你的数组是什么样的吗? – 2014-12-02 20:24:04

回答

2

你的问题有点令人困惑,我想是因为在我遇到的大多数代码中,代表一个使用数组的行和列的结构,“外部”数组代表行,“内部”数组代表列。例如:

arr = [ [ a, b ], 
     [ x, y ] ] 

在通常的模型中,(ab)是 “行” 0,和(xy)是第1行。这使得(ax)列0和(by )柱1.

但是您的代码表明,您的结构被倒置,与行0是(ax)和第1个存在(by),这使得(ab)列0和(x,y)第1列,所以我会这样回答。如果我们希望列中的每个值都等于同一列中的每个值(即a == b && x == y),那么这很容易。假设我们有以下数据:

arr = [ [ 10, 10, 10, 10 ], # <-- Column 0 
     [ 11, 11, 11, 11 ], # <-- Column 1 
     [ 12, 0, 12, 12 ] ] # <-- Column 2 

要检查是否在“列”每个值0等于0列所有其他价值,我们可以这样做:

arr[0].all? {|item| item == arr[0][0] } # => true 

这只是比较每第一项arr[0][0],一旦找到一个不相等的(true,如果不相等)则返回false

为了对每一个“行”做到这一点,我们可以在另一个包裹第一all?

arr.all? do |sub_arr| 
    sub_arr.all? {|item| item == sub_arr.first } 
end 
# => false 

编辑:如果阵列看起来不是这样的:

arr = [ [ 10, 11, 12 ], 
     [ 10, 11, 0 ], 
     [ 10, 11, 12 ], 
     [ 10, 11, 12 ] ] 
#   │ │ └─ Column 2 
#   │ └─ Column 1 
#   └─ Column 0 

解决这个问题的方法之一是:

first_row, *rest = arr 

rest.all? do |row| 
    row.each_with_index.all? do |item, col_idx| 
    row[col_idx] == first_row[col_idx] 
    end 
end 

第一行将第一行分配给first_row,将其余行分配给rest。然后,对于rest中的每一行,我们使用all?将每个项目与first_row中的相应项目进行比较。

P.S.另一种方式来解决这将是这样的:

arr.transpose.all? {|row| row.uniq.size == 1 } 

Array#transpose只是交换行和列(即转向[[a,b],[x,y]][[a,x],[b,y]]),然后在all?我们使用的每个“列”计数的唯一值(也就是现在一排)。如果有多个独特的价值,我们知道它们并不完全相同。当然,这有更多的开销:transposeuniq迭代每个值并返回一个新数组,而上面的方法只要发现任何不匹配的值就会停止。但是,只有25件物品可能不会那么糟糕,这取决于您需要运行的频率。

P.P.S.我很好奇第一种方法比第二种方法更好。你可以在这里看到代码和结果:https://gist.github.com/jrunning/7168af45c5fa5fb4ddd3因为第一种方法“短路” - 即。一旦它发现一个“错误”的值,它就会停下来 - 随着“错误”值的增加,它会变得更快。如果任何一行有错误值的机率为33%,则第一种方法比第二种方法执行速度快33%。有75%的机会,第一个比第二个执行速度快80%。我意识到这是比你需要更多的信息,但我觉得它很有趣。

+1

对不起,我写的这个问题实在太差,你在第一个假设中确实是正确的,即(a,x)和(b,y)是列。 – ZubatMan 2014-12-04 05:41:00

+0

@EllBells感谢您的澄清。我已经更新了我的答案。 – 2014-12-04 20:35:47

相关问题