我有一个使用转置的方法,但如果数组的维度少于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
任何帮助表示赞赏,
泰德
答案 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)
嗯,我可能会尝试#transpose
和rescue 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