Ruby 如何测试列中的所有项目是否相同
我正在编写一个程序,需要检查二维数组中每列的值是否相等。列数也是静态的,为5 目前,我有一个Ruby 如何测试列中的所有项目是否相同,ruby,multidimensional-array,Ruby,Multidimensional Array,我正在编写一个程序,需要检查二维数组中每列的值是否相等。列数也是静态的,为5 目前,我有一个if语句,它从一列迭代到另一列,并在一个巨大的检查中比较该列中的所有值: if column[0][i] == column[1][i] && column[0][i] == column[2][i] 编辑:对不起,我不是故意搞混的。该阵列创建一个5x5游戏板。行指的是每个数组,列指的是每个数组中的第n位。我认为您的问题有些令人困惑,因为在我遇到的大多数代码中,使用数组表示行和列的结构,
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
这只是将列中的每个项目与第一个项目arr[0][0]
进行比较,并在发现不相等的项目时返回false
(如果不相等,则返回true
)
为了对每个“行”执行此操作,我们可以将第一行包装到另一行:
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
arr.transpose.all? {|row| row.uniq.size == 1 }
第一行将第一行分配给first_row
,其余行分配给rest
。然后,对于rest
中的每一行,我们使用all?
将每个项目与第一行中的相应项目进行比较
另一种解决方法是:
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
arr.transpose.all? {|row| row.uniq.size == 1 }
只需交换行和列(即将[[a,b],[x,y]]
转换为[[a,x],[b,y]]
),然后在all?
中,我们使用计数每个“列”(现在是一行)中的唯一值。如果存在多个唯一值,我们知道它们并不都相等。当然,这有更多的开销:transpose
和uniq
迭代每个值并返回一个新数组,而上面的方法在发现任何不匹配的值时就会停止。但如果只提供25个项目,它可能不会那么糟糕,这取决于您需要它运行的频率
p.p.S.我很好奇第一种方法的性能比第二种好多少。您可以在这里看到代码和结果:因为第一种方法“短路”——即,一旦发现“错误”值,它就会停止,随着“错误”值概率的增加,它会变得更快。任何一行有33%的几率出现错误值,第一种方法的执行速度比第二种方法快33%。有75%的几率,第一个比第二个快80%。我意识到这比您需要的信息要多,但我发现它很有趣。您的代码看起来像是在比较“行”中的每个值,尽管哪些是“列”,哪些是“行”是有争议的。你能用一个简单的例子来说明你的数组是什么样子吗?对不起,我写的这个问题很糟糕,你的第一个假设(a,x)和(b,y)是列,实际上是正确的。@Ellbell谢谢你的解释。我已经更新了我的答案。