2012-08-01 69 views
2

我需要遍歷一個n維數組。該數組是從另一個函數構建並傳遞的,並且事先不知道維數。這需要使用類似於VBA的原始語言來完成。所以,不存在蟒蛇般的善良。當尺寸變化時遍歷一個n維數組

有誰知道這是如何實現的?

樣本數組可能像5 x 6 x 1 x 8數組。因此,它是維度1 = 5,維度2 = 6,維度3 = 1和維度4 = 8的4維數組。

我需要遍歷每個5 * 6 * 1 * 8 = 240元素並以某種方式記錄我的結果,以便將結果與元素相關聯。

編輯:爲了使它更清楚,在遍歷結束時,我想能夠說位置(2,3,1,5)處的元素是x。所以,我需要記錄數組中元素的位置和元素本身。

問題的陣列更喜歡這個

'全球多陣列爲Variant

「\現在,很多其他的功能,當發現有資格的候選人,加上陣列此陣」 \像下面。

REDIM多陣列(LEN(多陣列)+1) 多陣列(LEN(多陣列))= newElementArray()

` 所以,我結束了類似下面。只有維度會在運行時發生變化,所以我需要一個通用邏輯來遍歷它。 Multi Jagged Array

+0

你有在原始語言的一個foreach?或計數(數組)? – Samson 2012-08-01 21:55:45

+0

你確實有一些語言語法可用。 – 2012-08-01 22:10:19

+0

@radashk我確實有所有常用的,而計數,子串,中等,len等可用。猜猜它不是太原始:) – varun 2012-08-02 19:00:02

回答

3

讓一個coordinate表示一個元素在n維數組中的位置。例如(2,1,3,4)對應於位置上的元素:array[2][1][3][4]

var array = // n-dimensional 

function traverse(array, coordinate, dimension); 
    for(var i = 0 ; i < array.length ; i++){ 
     // assuming coordinate is immutable. Append the current iteration's index. 
     currentCoordinate = coordinate.add(i); 
     if(dimension == 1){ 
     doSomething(currentCoordinate, array[i]); 
     }else{ 
     traverse(array[i], currentCoordinate, dimension(array[i])); 
     }  
    } 
} 

coordinate = []; // at first, the top level coordinate is empty. 
traverse(array, coordinate, 4); // 4-dimensional 
+0

@greiner你提供的解決方案確實給了我遍歷,是的。但是,如果我使用這種方法,則會丟失元素的整體上下文。例如,我希望能夠告訴我打印的某個特定項目,例如索引(2,3,1,4)。就像我在我原來的問題中添加的「我需要遍歷每個5 * 6 * 1 * 8 = 240元素並以某種方式記錄我的結果,以便我可以將結果與元素」 – varun 2012-08-02 19:06:18

0

實施將依賴於它是否是一個多維陣列或交錯數組(數組的數組)作爲ggreiner所示。

如果你只需要遍歷數組的值,它可以是簡單的: (C#)

int[, ,] arr = new int[1, 3, 2] { { { 1, 2 }, { 3, 4 }, { 5, 6 } } }; 
foreach(int i in arr) 
    Console.WriteLine(i); 
+0

「聯繫起來,感謝您引入術語」鋸齒陣列「所有的拳頭:)現在我意識到我有一個鋸齒狀的陣列。該語言本身支持多維數組,但我不能聲明一個,因爲我不知道這些維度。因此我必須處理鋸齒狀數組。所以,我有一個主數組,然後代碼的不同部分不斷向這個數組添加元素,它們本身就是數組。現在,我可以自己遍歷這個,類似於@greiner上面解釋的。然而,真正的痛苦是記錄它的位置,就像它真的是一個多維數組。 – varun 2012-08-02 19:11:23