2011-08-09 61 views
2

我有一個方法使用轉置,但我不想應用此操作,如果數組有小於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

由於Ruby陣列可以容納任何東西,這是脆弱的,一個黑客在最好的,但你總是可以只檢查,看看是否第n個元素一個數組,即

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

我真的不喜歡這樣,所以如果有更好的東西只是打我或我downvote被遺忘。

1

嗯,我可能只是嘗試#transposerescue IndexError, TypeError,但另一個想法是:

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

你用正常的紅寶石陣列,而不是被如何

a.map{|e| e.is_a?(Array)}.uniq == [true] ? "#{e.size}D" : "1D" 
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. 

這種假設Matrix es。 如果數組不規則,你可能會遇到更糟糕的數據模型問題,因此這兩種方法中的一種可能就足夠了。

1

不要害怕錯誤,只是預計他們:

a.transpose rescue a