Ruby 如何测试列中的所有项目是否相同

Ruby 如何测试列中的所有项目是否相同,ruby,multidimensional-array,Ruby,Multidimensional Array,我正在编写一个程序,需要检查二维数组中每列的值是否相等。列数也是静态的,为5 目前,我有一个if语句,它从一列迭代到另一列,并在一个巨大的检查中比较该列中的所有值: if column[0][i] == column[1][i] && column[0][i] == column[2][i] 编辑:对不起,我不是故意搞混的。该阵列创建一个5x5游戏板。行指的是每个数组,列指的是每个数组中的第n位。我认为您的问题有些令人困惑,因为在我遇到的大多数代码中,使用数组表示行和列的结构,

我正在编写一个程序,需要检查二维数组中每列的值是否相等。列数也是静态的,为5

目前,我有一个
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谢谢你的解释。我已经更新了我的答案。