2010-04-02 37 views
18

¿Cómo puedo aplanar la matriz de 2 dimensiones int originalArray[][] en una matriz de 1 dimensión?Cómo aplanar matriz 2D a matriz 1D?

int a [] = {1,2,6,7,2}; 
    int b [] = {2,44,55,2}; 
    int c [] = {2,44,511,33}; 

    int originalArray [][] = new int[][]{a,b,c}; 

Respuesta

6

Un bucle simple hará, no es difícil, pero dependerá del orden en que se encuentre para copiar los valores. Por ejemplo (basado en el hecho de que en su ejemplo las matrices de todos tienen la misma longitud):

int[] newArray = new int[3 * a.length]; 
int index = 0; 
for (int n = 0; n < a.length; n++) { 
    newArray[index++] = a[n]; 
    newArray[index++] = b[n]; 
    newArray[index++] = c[n]; 
} 

o (orden diferente, a, b, c puede ser de diferentes longitudes):

int[] newArray = new int[a.length + b.length + c.length]; 
System.arrayCopy(a, 0, newArray, 0, a.length); 
System.arrayCopy(b, 0, newArray, a.length, b.length); 
System.arrayCopy(c, 0, newArray, a.length + b.length, c.length); 
+1

Las matrices de ejemplo no tienen la misma longitud. a.length == 5, b.length == 4, c.length == 4. – phihag

+1

También podría valer la pena mencionar que los dos ejemplos terminan con diferentes ordenamientos para la matriz aplanada final, si eso es importante.En el primer ejemplo, las matrices están 'tejidas', mientras que en el segundo, se colocan 'de extremo a extremo', si eso tiene sentido –

+1

@Kevin, creo que mencioné eso: 'orden diferente, a, b , c puede ser de diferentes longitudes ' – rsp

-1

Cuenta el número total de elementos en originalArray. Crea una nueva matriz de esa longitud. Copie los elementos uno por uno en la nueva matriz.

No estoy familiarizado con ninguna función de la biblioteca para hacerlo.

4

Habrá 2 pasos:

1) averiguar número total de elementos para crear un nuevo vector (array 1d)

2) iterar a través de la matriz de 2d en orden predefinido y copiar sus elementos para el vector creado

int elementsNumber = 0; 

for (int i = 0; i < originalArray.length; i++) { 
    elementsNumber += originalArray[i].length; 
} 

int[] newArray = new int[elementsNumber]; 
int j = 0; 
for (int i = 0; i < originalArray.length; i++) { 
    System.arrayCopy (originalArray[i], 0, newArray, j, originalArray[i].length); 
    j += originalArray[i].length; 
} 
2

Desde arrays no pueden extenderse (es decir que tiene que declarar el tamaño de un error en la inicialización), usted tiene que atravesar los arrays dos veces:

int size = 0; 
for (int[] ar : originalArray) size += ar.length; 
int[] result = new int[size]; 
int pos = 0; 
for (int[] ar : originalArray) { 
    System.arraycopy(ar, 0, result, pos, ar.length); 
    pos += ar.length; 
} 
+0

Wow, estoy bastante sorprendido recursividad no es necesario. – dclowd9901

+0

¿Alguien ha probado esta solución? –

+0

¿es posible no usar loop? – Jessy

38
Con

Guava, puede utilizar cualquiera

int[] all = Ints.concat(originalArray);

o

int[] all = Ints.concat(a, b, c);

+11

Downvoted ¿por qué? ¿Quién quiere escribir todo el código anterior cuando necesitan hacer esto? –

+0

¿Hay algún método para hacer lo mismo para una matriz de Objetos? – gvlasov

+3

'ObjectArrays.concat' –

2
int[] oneDArray = new int[arr.length*arr.length]; 
    //Flatten 2D array to 1D array... 
    int s = 0; 
    for(int i = 0; i < arr.length; i ++) 
      for(int j = 0; j < arr.length; j ++){       
       oneDArray[s] = arr[i][j]; 
       s++; 
      } 
23

Con Java 8 se puede "flatMap" las matrices internas:

int[] flatArray = Arrays.stream(originalArray) 
     .flatMapToInt(Arrays::stream) 
     .toArray(); 

o:

int[] flatArray = Stream.of(a, b, c) 
     .flatMapToInt(Arrays::stream) 
     .toArray(); 
Cuestiones relacionadas