with tutorial practical libreria español java arrays

java - tutorial - ¿Cómo aplanar matriz 2D a matriz 1D?



opencv python tutorial pdf español (7)

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

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


Como las matrices no pueden extenderse (es decir, tiene que declarar el tamaño de un error al inicializar), tiene que atravesar las matrices 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; }


Con guayaba , puedes usar cualquiera

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

o

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


Con Java 8 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();


Cuente el número total de elementos en originalArray. Crear 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.


Habrá 2 pasos:

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

2) iterar a través de su matriz 2d en un orden predefinido y copiar sus elementos al 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; }


Lo hará un simple bucle for, no es difícil, pero dependerá del orden en que desee copiar los valores. Por ejemplo (basado en el hecho de que en su ejemplo todas las matrices 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 tener 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);


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++; }