我有一個方法使用轉置,但我不想應用此操作,如果數組有小於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
任何幫助表示讚賞,
特德
我有一個方法使用轉置,但我不想應用此操作,如果數組有小於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
任何幫助表示讚賞,
特德
你可以遞歸找到它:
def getDimension(array)
if array.first.is_a?(Array)
1 + getDimension(array.first)
else
1
end
end
我知道這是一個有點粗糙,有可能別人誰能夠讓它更漂亮,但總的思路是清晰的。
由於Ruby陣列可以容納任何東西,這是脆弱的,一個黑客在最好的,但你總是可以只檢查,看看是否第n個元素一個數組,即
def is_2d(array)
array.first.is_a?(Array)
end
我真的不喜歡這樣,所以如果有更好的東西只是打我或我downvote被遺忘。
嗯,我可能只是嘗試#transpose
和rescue IndexError, TypeError
,但另一個想法是:
x.map(&:class).uniq == [Array]
你用正常的紅寶石陣列,而不是被如何
a.map{|e| e.is_a?(Array)}.uniq == [true] ? "#{e.size}D" : "1D"
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.
這種假設Matrix
es。 如果數組不規則,你可能會遇到更糟糕的數據模型問題,因此這兩種方法中的一種可能就足夠了。
不要害怕錯誤,只是預計他們:
a.transpose rescue a
它應該做的,如果維數不一致? –