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

时间:2016-03-24 19:37:53

标签: arrays ruby compare comparison

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

4 个答案:

答案 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}