2009-11-13 12 views
12

Ho due array per una variante di scacchi Sto codificando in java ... Ho una versione di console finora che rappresenta la scheda come un array 1D (la dimensione è 32), ma io Sto lavorando per creare una GUI e voglio che appaia come una griglia 4x8, quindi ho una matrice bidimensionale di JPanel ...Convertire un indice di array 2D in un indice 1D

Domanda è, c'è qualche formula che può convertire la matrice [i ] [j] indice in array [i] dato che è un array 4x8?

risposta

15

Attribuite 4 colonne per 8 righe poi:

i = row * 4 + col 

EDIT: Il mio male, nessuno mi ha preso su questo errore a quanto pare. Ma dovrebbe essere in realtà row * 4 + col.

row * 8 + col lascerebbe vuoti non necessari nei possibili indici.

+0

Non posso credere che non ho avuto che lol ... io avevo (i 4 *) + (I * 8) non c'è da stupirsi che fosse fuori limite, grazie! – Becky

+0

Sei il benvenuto. Ho dovuto fare esattamente la stessa cosa di recente con un gioco Tic Tac Toe che impara. Memorizzare le mosse del passato come un singolo indice è stato un passo verso il miglioramento dell'efficienza. –

+0

Continuo sempre a tornare a questa risposta, per qualche ragione non riesco proprio a trovare un modo per memorizzare questa equazione 'index = x + y * num_cols;' sarebbe bello aggiungere come lo deduciamo! – vexe

3

i*8+j (supponendo 8 è la dimensione orizzontale)

8

Ogni riga nell'array 2D viene posizionata all'estremità dell'array 1D. i indica la riga in cui ci si trova e j indica la colonna (quanto in quella riga). quindi se ti trovi nella riga ith, devi inserire le righe complete i complete, quindi aggiungere j in più per ottenere l'indice di array singolo.

Così sarà qualcosa di simile a
singleDimIndex = array[0].length * i + j

17

pensare in questo modo:

Hai un array che sembra essere una matrice tridimensionale 1, che in realtà, è solo una lunga concatenazione di elementi di una matrice bidimensionale.

Quindi, supponiamo di disporre di una matrice bidimensionale di dimensioni 5 x 3 (5 righe, 3 colonne). E vogliamo creare un array monodimensionale. Devi decidere se vuoi concatenare per righe o per colonne, per questo esempio diremo che la concatenazione è per righe. Pertanto, ogni riga è lunga 3 colonne, quindi è necessario pensare alla matrice monodimensionale come definita nei "passaggi" di 3. Quindi, la lunghezza della matrice monodimensionale sarà 5 x 3 = 15, e ora tu bisogno di trovare i punti di accesso.

Quindi, diciamo che stai accedendo alla 2a riga e alla 2a colonna della tua matrice bidimensionale, quindi finirebbe con 3 passi (prima riga) + il numero di passi nella seconda riga, o 3 + 2 = 5. poiché siamo base zero indicizzazione che è -1, in modo che sarebbe all'indice 4.

Ora per la formulazione specifica:

int oneDindex = (row * length_of_row) + column; // Indexes 

così, ad esempio di quanto sopra si sarebbe avvolgere con

oneDindex = (1 * 3) + 1 

E dovrebbe essere questo

+1

Ottimo! Grazie mille per aver spiegato come arrivare alla formula! – teo

+0

@ Michael è stata una grande spiegazione e anche +1, ma puoi per favore elaborare questo "Quindi, diciamo che stai accedendo alla 2a riga e alla 2a colonna del tuo array bidimensionale, quindi finirebbe con 3 passaggi (prima riga) + il numero di passaggi nella seconda riga, o 3 + 2 = 5. Dal momento che siamo indicizzati su base zero che è -1, così sarebbe nell'indice 4. " meglio. spiegalo meglio –

0

È possibile utilizzare questa classe ArrayConvertor per convertire array 2D in array 1D e viceversa.

Attenzione: la conversione di una matrice 2D in una normale funziona solo con una matrice.

public class ArrayConvertor { 
    static public int[] d2Tod1(int[][] array){ 

     int[] newArray = new int[array.length*array[0].length]; 

     for (int i = 0; i < array.length; ++i) 
     for (int j = 0; j < array[i].length; ++j) { 
      newArray[i*array[0].length+j] = array[i][j]; 
     } 

     return newArray; 
    } 

    static public int[][] d1Tod2(int[] array, int width){ 

     int[][] newArray = new int[array.length/width][width]; 

     for (int i = 0; i < array.length; ++i) { 
      newArray[i/width][i%width] = array[i]; 
     } 

     return newArray; 
    } 
} 

E Alcuni codice di test:

public class JavaMain{ 
    public static void main(String[] args) { 
     int[][] arr2D_1 = new int[4][8]; 

     byte counter=0; 
     for (int i = 0; i < 4; i++) 
     for (int j = 0; j < 8; j++) { 
      arr2D_1[i][j] = counter++; 
     } 

     int[]arr1D = ArrayConvertor.d2Tod1(arr2D_1); 
     int[][] arr2D_2 = ArrayConvertor.d1Tod2(arr1D, 8); 

     boolean equal = true; 
     for (int i = 0; i < arr2D_1.length; i++) 
     for (int j = 0; j < arr2D_1[0].length; j++){ 
      if(arr2D_1[i][j]!=arr2D_2[i][j]) equal=false; 
     } 

     System.out.println("Equal: "+equal); 
    } 
} 

uscita: Equal: vero

+0

Non penso che funzioni se hai un array più grande di 8 !! – schwiz

Problemi correlati