我想知道列表中的所有数组是否相同。==
比较两个数组,但我想知道是否有任何库方法可以判断列表中的所有数组是否相同。
您可以遍历数组列表一次,将第一个数组与所有其他数组进行比较。如果第一个数组等于所有其他数组,则列表中的所有数组都相等。这样的东西会起作用:
arrays = [[1,3],[1,3],[1,3]]
array0 = arrays.first
arrays[1..-1].all? { |a| array0 == a }
# => true
arrays = [[1,3],[1,3],[1,4]]
array0 = arrays.first
arrays[1..-1].all? { |a| array0 == a }
# => false
我很好奇这里每个解决方案的性能。如果你喜欢的话,欢迎用你自己的结果来编辑这篇文章。
在我的测试中,两种方法之间的差异随着数组列表的长度而增加,所以我最好测量一个相对较短的数组的长列表。我总是跑几次来消除GC可能带来的影响。
require 'benchmark'
n = 10
n_arrays = 1000000
arrays = [(1..n).to_a] * n_arrays
Benchmark.bm(14) do |bm|
bm.report("1st vs others:") do
array0 = arrays.first
arrays[1..-1].all? { |a| array0 == a }
end
bm.report("uniq:") { arrays.uniq.size == 1 }
bm.report("each_cons:") { arrays.each_cons(2).all?{|x, y| x == y} }
end
结果表明,虽然each_cons
方法与"1st vs others"方法大致相同(仅略慢),但使用uniq
的方法要慢得多。
user system total real
1st vs others: 0.080000 0.000000 0.080000 ( 0.080872)
uniq: 1.810000 0.000000 1.810000 ( 1.807646)
each_cons: 0.180000 0.000000 0.180000 ( 0.174251)
[[1,3],[1,3],[1,3]].uniq.size == 1
#=> true
[[1,3],[1,3],[1,4]].uniq.size == 1
#=> false
array.each_cons(2).all?{|x, y| x == y}