如何确定阵列的尺寸数?

时间:2011-08-09 00:08:02

标签: ruby

我有一个使用转置的方法,但如果数组的维度少于2个,我不想应用此操作。我想知道如何在红宝石中做到这一点。

so for an array like [1,2] -> it should say 1D

and for an array like [[1,2],[1,2]] it should say 2D

任何帮助表示赞赏,

泰德

6 个答案:

答案 0 :(得分:2)

你可以递归地找到它:

def getDimension(array)
  if array.first.is_a?(Array)
    1 + getDimension(array.first)
  else
    1
  end
end

我知道它有点粗糙,可能有人能够做得更好,但总体思路很明确。

答案 1 :(得分:1)

因为Ruby数组可以容纳任何脆弱的东西并且最好是hack,但是你总是可以检查 nth 元素是否是一个数组,即

def is_2d(array)
  array.first.is_a?(Array)
end

我真的不喜欢这个,所以如果有更好的东西只是打我或者让我忘掉了。

答案 2 :(得分:1)

嗯,我可能会尝试#transposerescue IndexError, TypeError,但另一个想法是:

x.map(&:class).uniq == [Array]

答案 3 :(得分:1)

怎么样

a.map{|e| e.is_a?(Array)}.uniq == [true] ? "#{e.size}D" : "1D"

答案 4 :(得分:1)

module MultiDArray #this could be a subclass of Array 
                   #if you can modify your callers
 def self.transposable?(array)
    array[0] && array[0][0] 
 end
 def self.dimensions(array)
    return 0 if array.nil?
    return self.dimensions(array[0]) if array[0].is_a?(Array)
    return 1
 end
 def self.dimension_to_s(array)
    "#{dimensions(array)}D"
 end
end


MultiDArray.transposable? #is probably what you're actually looking for.

这假设您使用的是普通的ruby数组而不是Matrix es。 如果数组不规则,你可能会遇到更糟糕的数据模型问题,所以这两种方法中的一种可能就足够了。

答案 5 :(得分:1)

不要害怕错误,只是期待它们:

a.transpose rescue a