4

有没有最好和最有效的方法来检查数组的元素是否相同?

[[1,2], [3,4], [5]] => false

[[1,2], [3,4], [5,6]] => true

我有什么:

def element_of_same_size?(arr)
  arr.map(&:size).uniq.size == 1
end

另一种解决方案:

def element_of_same_size?(arr)
  arr[1..-1].each do |e|
    if e.size != arr.first.size
      return false
    else
      next
    end
  end
  return true
end

当它发现一个元素与第一个元素的大小不同时,它会立即返回 false。

有没有最好的方法来做到这一点?(当然...)

4

6 回答 6

13

使用Enumerable#all?方法怎么样?

def element_of_same_size?(arr)
  arr.all? { |a| a.size == arr.first.size }
end

element_of_same_size?([[1,2], [3,4], [5]])
# => false

element_of_same_size?([[1,2], [3,4], [5, 6]])
# => true
于 2013-08-08T15:25:06.593 回答
3

再交付一个单行:

您可以使用chunkone?

[[1,2], [3,4], [7,8], [5,6]].chunk(&:size).one?
于 2013-08-08T16:06:49.793 回答
2

我喜欢 toro2k 的回答。我只是想添加将方法添加到数组类本身的可能性,并警告您不是数组但响应size方法的元素仍可能返回 true。(编辑:如果为空数组则为假)

class Array
  def same_element_size?
    return false if self.empty?
    sz = self.first.size
    self.all? {|k| k.size==sz}
  end
end

ar  = [[1,2], [3,4], [5]]
ar2 = [[1,2], [3,4], [5,6]]
ar3 = [[1,2], 'hi', [4,5]]

[[], ar, ar2, ar3].each {|array|
  puts "%30s --> %s" % [array.inspect, array.same_element_size?]
}

#                            [] --> false
#         [[1, 2], [3, 4], [5]] --> false
#      [[1, 2], [3, 4], [5, 6]] --> true
#        [[1, 2], "hi", [4, 5]] --> true
于 2013-08-08T15:43:18.810 回答
2

只是为了好玩,如果Array你选择扩展,你可以选择更灵活的东西,比如实现一个same?方法:

class Array
  def same? &block
    if block_given?
      f = block.call(first)
      all? {|a| block.call(a) == f}
    else
      all? {|a| a == first }
    end
  end
end

这允许:

[[1,2], [5,6], [8,9]].same?(&:size)

或者

[[1,2], [7,8], [5,6], [8,9]].same?(&:max)

或只是(默认情况下将与 比较==

[[1,2], [7,8], [5,6], [8,9]].same?
于 2013-08-08T16:37:17.907 回答
0

如果处理非嵌套数组的数组,您可以测试以确保矩阵是正方形的。它将递归数组抛出窗外,但有点简洁。

require 'matrix'

a1 = [[1,2],[3,4],[5,6]]
a2 = [[1,2,3],[4,5,6]]
a3 = [[1,2],3,4,[5,6]]

Matrix[a1].square? == true
Matrix[a2].square? == true
Matrix[a3].square? == false
于 2013-08-08T16:44:22.167 回答
0

一些基准:

                                  user     system      total        real
  standalone all                0.234000   0.000000   0.234000 (  0.246025)
  class method all              0.234000   0.000000   0.234000 (  0.235024)
  class method transpose        0.920000   0.000000   0.920000 (  0.940094)
  chunk and one?                1.591000   0.000000   1.591000 (  1.610161)

我的钱花在了使用 Enumerable#all 的类方法上?通过 toko2k

于 2013-08-08T16:20:34.610 回答