2009-01-23 21 views
7

Tengo una matriz en forma de 'int[][]' que representa las coordenadas de una cuadrícula pequeña. Cada coordenada tiene asignado su propio valor. por ejemplo, array[0][4] = 28 ......Java int [] [] matriz - iterando y encontrando el valor

Tengo dos preguntas. En primer lugar, ¿cómo iterar a través de todos los valores almacenados? En segundo lugar, quiero poder ingresar un valor y devolver sus coordenadas específicas en la grilla. ¿Cuál sería la mejor manera de abordar esto?

¡Gracias por cualquier ayuda!

+0

Si esto es tarea, debe tenerlo claro (además de usar la etiqueta de tarea). –

Respuesta

23

Puede iterar con cualquiera de los bucles o mejorados para bucles:

for (int row=0; row < grid.length; row++) 
{ 
    for (int col=0; col < grid[row].length; col++) 
    { 
     int value = grid[row][col]; 
     // Do stuff 
    } 
} 

o

// Note the different use of "row" as a variable name! This 
// is the *whole* row, not the row *number*. 
for (int[] row : grid) 
{ 
    for (int value : row) 
    { 
     // Do stuff 
    } 
} 

La primera versión sería la solución más sencilla a la pregunta "encontrar las coordenadas" - simplemente verifique si el valor en el ciclo interno es correcto.

+0

+1 por completar, pero cambiaría el nombre de 'i' y 'j' por 'fila' y 'col'. –

+0

Oh, está bien :) Ahora mira cómo no lo hago constantemente ... –

+1

Pero Outlaw, si lo hace, no rendirá homenaje a Fortran. –

3

para iterar sobre los valores de uso bucles:

int[][] matrix 
//... 
for(int row[] : matrix) 
    for(int cell : row){ 
     //do something with cell 
    } 

acceder a las coordenadas basado en el valor que se necesita algún tipo de doble HashMap (busque una en java.util.HashMap) pero estoy consciente de nada que lo haga directamente

+0

Puedes hacerlo con un hashmap regular. Solo necesita definir un objeto para usar como la clave que tiene ambas coordenadas. – Herms

+0

@Herms: quiere ver las coordenadas por el valor. entonces la clave debe ser el valor de la celda. las cosas se volverán más complicadas si las celdas múltiples pueden tener el mismo valor, pero todavía es factible – user54579

+0

Creo que tener otra estructura de datos aquí es probablemente una mala idea. Puede ser difícil mantenerlos sincronizados. Probablemente sea mejor buscar en toda la tabla, aunque será más lento. –

1

A menos que su grilla esté ordenada de alguna manera, entonces probablemente no haga nada mejor que una búsqueda de fuerza bruta.

Para la iteración, yo creo que sería algo como esto (sintaxis podría ser un poco, no he tratado con matrices en java para un rato.):

int[][] grid; // just assuming this is already assigned somewhere 

for(int x = 0 ; x < grid.length ; x++) { 
    int[] row = grid[x]; 
    for(int y = 0 ; y < row.length ; y++) { 
    int value = row[y]; 
    // Here you have the value for grid[x][y] and can do what you need to with it 
    } 
} 

para la búsqueda que había probablemente necesite usar eso para iterar, luego regrese una vez que lo haya encontrado.

Si está buscando varias veces la posición del mismo valor, puede memorizar los resultados usando una tabla hash.

2

para iterar sobre todos los elementos de la red intente esto:

int grid[][] = new int[10][10]; 

for(int i = 0; i < grid.length(); ++i) { 
    for(int j = 0; j < grid[i].length(); ++j) { 
     // Do whatever with grid[i][j] here 
    } 
} 
-1

Generalmente no hay manera de encontrar las coordenadas específicas de un determinado valor, excepto pasando a través de la matriz y la búsqueda de ella. Sin embargo, si se garantiza que los valores en la matriz son únicos (es decir, cada valor solo ocurre en una celda), puede mantener una matriz separada como índice, que almacena las coordenadas de cada valor indexado por el valor.

+0

Engañoso, una tabla hash lo hace fácilmente. –

0

Utilice los bucles anidados para iterar sobre las dimensiones xey, lo que le permite revisar cada valor, de a uno por vez.

Para ingresar un valor, solo haga lo mismo que arriba, pero busque una coincidencia con el valor solicitado.

0

Será más feliz si bloquea todas estas colecciones dentro de una sola clase y no las expone de ninguna manera.

Esto significa mover sus rutinas de búsqueda y búsqueda a esta clase también.

Para el almacenamiento, todos están cubiertos iterando, agregue una tabla hash y una búsqueda.Pongo este comentario en la publicación de nickolai:

Almacene el nuevo entero (ix + iy * 1000) como el valor en su tabla hash. Si su índice y puede ir más de 1000, use un número mayor: las cifras son realmente grandes. Para recuperarlo, use ix = val% 1000, iy = val/1000.

Si su matriz y hashtable están encapsulados en la misma clase, el resto de su código será bastante fácil de escribir y mucho más limpio.

Cuestiones relacionadas