我想知道列表中的所有数组是否相同。
==
比较两个数组,但我想知道是否有任何库方法来判断列表中的所有数组是否相同。
答案 0 :(得分:2)
您只需遍历一次数组列表,将第一个数组与所有其他数组进行比较。如果第一个等于所有其他数组,则列表中的所有数组都相等。这样的事情会起作用:
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
答案 1 :(得分:2)
我对这里每个解决方案的性能感到好奇。如果您愿意,欢迎使用您自己的结果编辑此帖子。
在我的测试中,方法之间的差异与数组列表的长度有关,因此我最好测量一长串相对较短的数组。我总是做一些运行来消除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
方法与第一种方法相比(仅稍微慢一点),但第一种方式与其他种类方式相同。方法,使用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)
答案 2 :(得分:1)
[[1,3],[1,3],[1,3]].uniq.size == 1
#=> true
[[1,3],[1,3],[1,4]].uniq.size == 1
#=> false
答案 3 :(得分:1)
array.each_cons(2).all?{|x, y| x == y}