2012-08-01 73 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