如何测试列中的所有项目是否相同
我正在编写一个程序,需要检查二维数组的每列中的值是否相等。列数也是静态的,为五。如何测试列中的所有项目是否相同
目前,我有一个if
语句从列迭代列在一个巨大的检查比较所有的值在该列:
if column[0][i] == column[1][i] && column[0][i] == column[2][i]
编辑:对不起,我不打算的混乱。阵列创建一个5x5的游戏板。行是指每个单独的数组,列是指每个数组中的第n位数字。
你的问题有点令人困惑,我想是因为在我遇到的大多数代码中,代表一个使用数组的行和列的结构,“外部”数组代表行,“内部”数组代表列。例如:
arr = [ [ a, b ],
[ x, y ] ]
在通常的模型中,(a
,b
)是 “行” 0,和(x
,y
)是第1行。这使得(a
,x
)列0和(b
,y
)柱1.
但是您的代码表明,您的结构被倒置,与行0是(a
,x
)和第1个存在(b
,y
),这使得(a
,b
)列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?
我们使用的每个“列”计数的唯一值(也就是现在一排)。如果有多个独特的价值,我们知道它们并不完全相同。当然,这有更多的开销:transpose
和uniq
迭代每个值并返回一个新数组,而上面的方法只要发现任何不匹配的值就会停止。但是,只有25件物品可能不会那么糟糕,这取决于您需要运行的频率。
P.P.S.我很好奇第一种方法比第二种方法更好。你可以在这里看到代码和结果:https://gist.github.com/jrunning/7168af45c5fa5fb4ddd3因为第一种方法“短路” - 即。一旦它发现一个“错误”的值,它就会停下来 - 随着“错误”值的增加,它会变得更快。如果任何一行有错误值的机率为33%,则第一种方法比第二种方法执行速度快33%。有75%的机会,第一个比第二个执行速度快80%。我意识到这是比你需要更多的信息,但我觉得它很有趣。
对不起,我写的这个问题实在太差,你在第一个假设中确实是正确的,即(a,x)和(b,y)是列。 – ZubatMan 2014-12-04 05:41:00
@EllBells感谢您的澄清。我已经更新了我的答案。 – 2014-12-04 20:35:47
你的代码看起来像是在比较“行”中的每个值 - 尽管哪些是“列”,哪些是“行”是有争议的。你能用一个简单的例子来说明你的数组是什么样的吗? – 2014-12-02 20:24:04