如何知道列表中的多个数组是否相同



我想知道列表中的所有数组是否相同。==比较两个数组,但我想知道是否有任何库方法可以判断列表中的所有数组是否相同。

您可以遍历数组列表一次,将第一个数组与所有其他数组进行比较。如果第一个数组等于所有其他数组,则列表中的所有数组都相等。这样的东西会起作用:

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}

相关内容

  • 没有找到相关文章

最新更新