找到阵列是否是2d阵列的简单方法?

时间:2015-12-09 06:43:11

标签: ruby

有一个更好的替代方法来查找数组是否是2d数组。

my_array = [["a", "b"],["c", "d"],["e", "f"]]
!my_array.map{|element| element.is_a? Array}.include? false

有什么想法吗?

4 个答案:

答案 0 :(得分:7)

我认为通过" 2d阵列" (在Ruby中没有任何意义),OP想要确定数组的每个元素是否都是一个数组,并且所有这些元素数组都是相同的大小,就像" 2d矩阵"的情况一样。

编辑2:这是另一种方式(比我原来的答案要好得多!):

def all_elements_arrays_of_same_size?(a)
  !!(a.transpose rescue nil)
end

all_elements_arrays_of_same_size? [["a", "b"],["c", "d"],["e", "f"]]
  #=> true 
all_elements_arrays_of_same_size? [["a", "b"],["c", "d", "g"],["e", "f"]]
  #=> false 
all_elements_arrays_of_same_size? [["a", "b"],"c",["e", "f"]]
  #=> false
all_elements_arrays_of_same_size? [["a", "b"],"c", {a:1}]
  #=> false
all_elements_arrays_of_same_size? [[1,2,3,4,5,6,7,8], 1]
  #=> false

编辑1: @WandMaker非常好[关于我原来的答案]。以前我有a.map(&:size).minmax.uniq.size。我按照他的建议删除了minimax。]

我假设了一个" 2D阵列"是一个数组,其元素是相同大小的数组。

def all_elements_arrays_of_same_size?(a)
  a.all? { |e| e.class==Array } && a.map(&:size).uniq.size == 1
end

all_elements_arrays_of_same_size? [["a", "b"],["c", "d"],["e", "f"]]
  #=> true 
all_elements_arrays_of_same_size? [["a", "b"],["c", "d", "g"],["e", "f"]]
  #=> false 
all_elements_arrays_of_same_size? [["a", "b"],"c",["e", "f"]]
  #=> false
all_elements_arrays_of_same_size? [["a", "b"],"c", {a:1}]
  #=> false
all_elements_arrays_of_same_size? [[1,2,3,4,5,6,7,8], 1]
  #=> false

对于最后一个示例,请注意[1,2,3,4,5,6,7,8].size #=> 81.size #=> 8

步骤如下:

有关:

array = [["a", "b"],["c", "d"],["e", "f"]]

array.all? { |e| e.class==Array }
  #=> true 
a = array.map(&:size)
  #=> [2, 2, 2] 
b = a.uniq
  #=> [2] 
b.size == 1
  #=> true 

另一方面,对于:

array = [["a", "b"],["c", "d", "g"],["e", "f"]]

array.all? { |e| e.class==Array }
  #=> true 
a = array.map(&:size)
  #=> [2, 3, 2] 
b = a.uniq
  #=> [2, 3] 
b.size == 1
  #=> false

有关:

array = [["a", "b"],"c", {a:1}]

array.all? { |e| e.class==Array }
  #=> false

答案 1 :(得分:3)

超级简单!

my_array.all? { |e| e.kind_of? Array }

查看enumerable模块。如果要检查所有元素,请使用all?;如果有一个数组元素就足够,则使用any?。这些方法记录在链接

答案 2 :(得分:1)

您需要的是all?

a = [["a", "b"],["c", "d"],["e", "f"]]
#=> [["a", "b"], ["c", "d"], ["e", "f"]]
a.all?{|el| el.is_a? Array}
#=>true

在Ruby中,Arrays是对象,只有一个维度。但它们可以容纳任何东西,包括其他阵列,因此它们可以表现为多种 维数组。

答案 3 :(得分:0)

鉴于明确的规范,这将确保您只有一个2D而不是3 + D数组:

my_array.all? { |e| (e.kind_of? Array) && e.flatten(1) == e}
相关问题