2009-11-30 80 views
10

我有,迭代一维数组作为二维数组

int[10] oneDim = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, index = 0; 

如​​所示,我们创建从原点的二维之一。但我怎么遍历我oneDimfor (index = 0; index < 10; index++),这样我可以让我的列索引行索引没有创建一个新的? 我希望它看起来像这样在打印过程中其索引到一个二维数组(2×5)

0,0 
0,1 
1,0 
1,1 
2,0 
2,1 
3,0 
3,1 
4,0 
4,1 

我认为这里的主要问题是如何在列索引行索引而无需创建二维的。你不是吗?

+0

咦?你想要一个一维数组看起来像一个二维数组? –

+0

@Simon Righarts:这是标准。编译器每天都会为你做。 – jason

+0

tomiko,正如你所看到的人们正在努力理解你的问题,而不是努力解决你的问题。请回顾你的问题,以便我们不必费尽脑筋去理解你。我确信你想要做的事很简单,一旦你花时间表达自己,我相信你会得到一些有意义的帮助。 – pstanton

回答

29

如果你想定的行优先的顺序,排rowIndex,列columnIndex并伪造(因为缺乏一个更好的词)与numberOfColumns列的二维数组,其公式为

rowIndex * numberOfColumns + columnIndex. 

如果你想行优先顺序,给定的行rowIndex,列columnIndex并伪造(因为缺乏一个更好的词)与numberOfRow行的二维数组,其公式为

columnIndex * numberOfRows + rowIndex. 

因此,假设行优先顺序:

int[10] oneDim = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; 
int rows = 2; 
int columns = 5; 
for (int row = 0; row < rows; row++) { 
    for (int column = 0; column < columns; column++) { 
     System.out.println(row + ", " + column + ": " + oneDim[row * columns + column]); 
    } 
} 

输出:

0, 0: 1 
0, 1: 2 
0, 2: 3 
0, 3: 4 
0, 4: 5 
1, 0: 6 
1, 1: 7 
1, 2: 8 
1, 3: 9 
1, 4: 10 

如果你在索引坚持使用单一for循环,假设行主顺序,公式,你希望是这样的:

int column = index % numberOfColumns; 
int row = (index - column)/numberOfColumns; 

如果您使用列优先的顺序,你想要的公式如下:

int row = index % numberOfRows; 
int column = (index - row)/numberOfRows; 

所以,

int[10] oneDim = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; 
int rows = 2; 
int columns = 5; 
for(int index = 0; index < 10; index++) { 
    int column = index % columns; 
    int row = (index - column)/columns; 
    System.out.println(row + ", " + column + ": " + oneDim[index]); 
} 

将输出

0, 0: 1 
0, 1: 2 
0, 2: 3 
0, 3: 4 
0, 4: 5 
1, 0: 6 
1, 1: 7 
1, 2: 8 
1, 3: 9 
1, 4: 10 

预期。

+0

太棒了!这就是我要的。 谢谢。 :D –

+1

你的意思是“专栏” - 第二段的主要订单?在这么多年之后,你不想让你编辑。 :-) –

8

您显示的两个数字可按照您显示的顺序分别计算为index/2index%2。这是你所说的“这个问题”的意思吗?

+0

好吧,这是'问题'! 谢谢。 :D –

2

我认为这是你想要做的事情......将一个暗淡的数组转换成一个两个暗淡的数组。

//this is just pseudo code...not real syntax 

int[10] oneDim = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; 

int first_dim = 5; 
int second_dim = 2; 

int[first_dim][second_dim] new_array; 

for (int fdi = 0; fdi < first_dim; fdi++){ 
    for (int sdi = 0; sdi < second_dim; sdi++) { 

     //this is the crux...you're calculating the one dimensional index to access the value 

     new_array[fdi][sdi] = oneDim[fdi*second_dim + sdi] 

    } 
}