2011-04-06 16 views
6

Esta es mi primera pregunta en una comunidad como esta, por lo que mi formato en cuestión puede no ser muy bueno para eso en primer lugar.Cómo copiar en profundidad una matriz de dos dimensiones (diferentes tamaños de fila)

Ahora que mi problema es que quiero copiar en profundidad una matriz de 2 dimensiones en Java. Es bastante fácil cuando lo haces en una matriz de 1 dimensión o incluso de 2 dimensiones con un tamaño fijo de filas y columnas. Mi principal problema es que no puedo realizar una inicialización de la segunda matriz intento copiar tales como:

int[][] copyArray = new int[row][column] 

Debido a que el tamaño de la fila no es fijo y los cambios en cada índice de la fila como intento copiar esta matriz:

int[][] envoriment = {{1, 1, 1, 1}, {0, 1, 6}, {1}}; 

Como puede ver, si digo new int[3][4] habrá espacios adicionales, que no quiero. ¿Hay algún método para copiar profundamente este tipo de arreglo bidimensional?

Respuesta

11

creo que lo que quiere decir es que el tamaño de la columna no es fijo. De todos modos una manera simple y directa sería:

public int[][] copy(int[][] input) { 
     int[][] target = new int[input.length][]; 
     for (int i=0; i <input.length; i++) { 
     target[i] = Arrays.copyOf(input[i], input[i].length); 
     } 
     return target; 
} 
+0

Buena solución general –

+0

Impresionante, esto es lo que busco en general. Gracias por todas las respuestas que todos me ayudaron :) – Dagohan

3

Usted no tiene que inicializar ambas dimensiones al mismo tiempo:

int[][] test = new int[100][]; 
test[0] = new int[50]; 

¿Ayuda?

+0

Oh, esta información ayudará. Nunca pensé en inicializar dimensiones en diferentes tiempos – Dagohan

-1

Es posible que tenga algo como esto:

public class Example { 
    public static void main(String[] args) { 

    int[][] envoriment = {{1, 1, 1, 1}, {0, 1, 6}, {1}}; 

    int[][] copyArray = new int[envoriment.length][]; 
    System.arraycopy(envoriment, 0, copyArray, 0, envoriment.length); 
    } 
} 
+1

Esta es una copia superficial. – rlibby

+1

El código que está proponiendo es de poca profundidad, ¿no? La matriz copiará cada valor de la matriz de entorno en la nueva. Es: copiará las referencias a las filas originales. No va a copiar las sub-matrices. – helios

+0

@rlibby y @Helios, ¿están seguros de que es una copia superficial? Pensé que es una copia profunda. En ese caso, déjame volver a visitar. Podría estar equivocado. Gracias por mencionarlo. – Shankar

1

Java 8 lambdas facilitan esta tarea:

int[][] copy = Arrays.stream(envoriment).map(x -> x.clone()).toArray(int[][]::new); 

También puede escribir .map(int[]::clone) después JDK-8056051 es fijo, si usted piensa que es más clara.

Cuestiones relacionadas