2009-11-30 23 views
10

ja,iteracji jeden wymiar tablicy w tablicy dwóch wymiarach

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

jak pokazano here, że tworzenie się dwuwymiarowego jednego z pochodzenia. Ale w jaki sposób iteracyjne mój oneDim wewnątrz for (index = 0; index < 10; index++) tak, że mogę dostać mój indeks kolumny i indeks wierszatambez utworzenie nowego? Chcę wygląda to podczas drukowania swoje indeksy do dwuwymiarowej tablicy (2x5):

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

Myślę, że głównym problemem jest tu uzyskanie indeksu kolumnie i indeks wiersza bez tworzenia dwuwymiarowy. Czy nie?

+0

Huh? Chcesz jednowymiarową tablicę wyglądać jak dwuwymiarowa tablica? –

+0

@Simon Righarts: To jest standard. Kompilator robi to za Ciebie codziennie. – jason

+0

tomiko, jak widać, ludzie walczą, aby zrozumieć twoje pytanie, nie walcząc o rozwiązanie twojego problemu. sprawdź swoje pytanie, abyśmy nie musieli nadwyrężać umysłów, aby cię zrozumieć. Jestem pewien, że to, co próbujesz zrobić, jest bardzo proste, kiedy poświęcisz czas, by wyrazić swoje zdanie, na pewno otrzymasz znaczącą pomoc. – pstanton

Odpowiedz

29

Jeśli chcesz row-major zamówienie, biorąc pod uwagę wiersz rowIndex, kolumnę columnIndex i udaje (z braku lepszego określenia) dwuwymiarowej tablicy z numberOfColumns kolumn, formuła jest

rowIndex * numberOfColumns + columnIndex. 

Jeśli chce wiersz znaczne zamówienie, ponieważ hałas rowIndex kolumna columnIndex i fałszowanie (na brak lepszych słowa) dwuwymiarowej tablicy o numberOfRow rzędach, formuła jest

columnIndex * numberOfRows + rowIndex. 

Więc zakładając row-major zamówienie:

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]); 
    } 
} 

wyjściowa:

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 

A jeśli nalegać na indeksowanie za pomocą pojedynczego for pętli, zakładając row-major zamówienie, formułę, która cię chcę:

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

Jeśli używasz kolumnowego zamówienia głównego, pożądana jest następująca formuła:

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

Więc

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]); 
} 

wyjście wola

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 

jak oczekiwano.

+0

świetnie! To jest to czego chcę. dzięki. : D –

+1

Czy chodziło Ci o "kolumnę" - porządek w drugim akapicie? Nienawidzę cię edytować po tylu latach. :-) –

8

Dwa numery, które wyświetlasz, można obliczyć w kolejności, w jakiej są wyświetlane, odpowiednio jako index/2 i index%2. Czy to masz na myśli "problem"?

+0

OK, to "problem"! dzięki. : D –

2

Myślę, że to jest to, co próbujesz zrobić ... przekształcić jednościenną tablicę w tablicę z dwoma dimami.

//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] 

    } 
} 
Powiązane problemy