JavaRush /Blog Java /Random-ES /Clase de matrices y su uso.

Clase de matrices y su uso.

Publicado en el grupo Random-ES
¡Hola de nuevo! :) En la última lección, nos familiarizamos con una estructura de datos como una matriz (matriz Java), aprendimos cómo crear matrices, llenarlas con datos y también aprendimos cómo se almacenan en la memoria. Hoy veremos algunas tareas y ejemplos de trabajo con matrices que encontrará a menudo en el trabajo real. Por ejemplo, imagina esta situación: tenemos una matriz de 10 números escritos en orden aleatorio.
//array Java, example
int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};
Nuestra tarea es ordenar esta matriz en orden ascendente: del menor al mayor número. Al final debería verse así:
[-234, -2, 16, 26, 35, 43, 80, 92, 99, 167]
Cómo hacemos esto? La tarea no es trivial, nunca hemos hecho esto antes :/ ¿Alguna idea? Intenta adivinar. Esto es lo que podemos hacer, por ejemplo:
  • Iterar a través de todos los elementos de la matriz. Compara cada elemento con el siguiente ( [0]con [1], [1]con [2], [2]con , [3]etc.). Si el elemento de la matriz actual es más grande que el siguiente, los intercambiamos y pasamos al siguiente elemento. Si no, déjalo como está y sigue adelante.

  • Por lo tanto, después del primer paso por los elementos de la matriz, se garantiza que el valor más grande (167) estará en la última celda.

  • Ahora repasemos todos los elementos de la matriz nuevamente, comenzando con el elemento con índice [0], pero hasta el penúltimo elemento (el número más grande ya está en su lugar) y hagamos las mismas comparaciones e intercambios. 
    Al final, en la penúltima celda tendremos el segundo valor más alto (99).

  • Repitamos este trabajo tantas veces como tengamos elementos menos uno en la matriz.
Clase de matrices y su uso - 2Se nos ocurrió la idea, solo queda escribir el código. Se verá así:
public class Main {

   public static void main(String[] args) {

       int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};

       for (int i = numbers.length - 1; i > 0; i--) {
           for (int j = 0; j < i; j++) {
           /* Compara los elementos en pares,
             si están en el orden incorrecto,
             entonces cámbialos */
               if (numbers[j] > numbers[j + 1]) {
                   int tmp = numbers[j];
                   numbers[j] = numbers[j + 1];
                   numbers[j + 1] = tmp;
               }
           }
       }

   }
}
Uh... Parece un poco complicado -_- Incluso si el principio general de funcionamiento es claro, tienes que escribir bastante código para resolver una tarea aparentemente tan simple. Bien, ¿tal vez simplemente nos sobreestimamos a nosotros mismos? Probablemente la tarea que hemos asumido hasta ahora nos resulte demasiado difícil. Intentemos hacer algo más sencillo. Por ejemplo, tomemos el mismo conjunto de números.
int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};
Nuestra tarea es copiar su contenido a otra matriz.
int [] numbersCopy = new int[10];
Piense en cómo haría esto utilizando el conocimiento sobre matrices que ya tiene. Puede, por ejemplo, recorrer una matriz numbersy escribir sus elementos uno por uno en numbersCopy:
public class Main {

   public static void main(String[] args) {

       int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};

       int [] numbersCopy = new int[10];

       for (int i = 0; i < numbers.length; i++) {

           numbersCopy[i] = numbers[i];
       }

   }
}
Bueno, ¡más o menos lo hemos logrado! El problema parece haberse resuelto, pero nuevamente: si es necesario ejecutarlo con frecuencia, el código tendrá un montón de bucles idénticos. De hecho, estos y otros problemas han sido resueltos hace mucho tiempo por los creadores de Java, y no necesitamos “reinventar la rueda” y escribir código para nuestra propia solución.

Clase de matrices Java

Una clase especial de Java le ayudará a resolver problemas típicos al trabajar con matrices: Arrays. Se han agregado métodos a esta clase para resolver los problemas más comunes que encuentran los programadores de Java en su trabajo. Por ejemplo, la tarea de ordenar una matriz, para la cual nosotros mismos intentamos encontrar soluciones, se puede resolver en una línea:
public class Main {

   public static void main(String[] args) {

       int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};

       Arrays.sort(numbers);

       System.out.println(Arrays.toString(numbers));

   }
}
El método Arrays.sort()ordena la matriz. Además, el algoritmo incorporado lo hace mucho más eficiente que el código que escribimos. Salida de consola:

[-234, -2, 16, 26, 35, 43, 80, 92, 99, 167]
Tenga en cuenta: para convertir la matriz en una cadena, utilizamos otro método de clase Arrays: Arrays.toString(). Las matrices Java en sí mismas no anulan el archivo toString(). Entonces si solo escribes
System.out.println(numbers.toString());
Se llamará al método toString()de clase Object. En el caso de los arrays, el resultado será algo como esto:

[I@4554617c
Ahora no entraremos en detalles sobre por qué la conclusión es así; lo principal es que claramente esto no es lo que necesitamos. Pero Arrays.toString() hizo lo que queríamos. Por cierto, nuestro problema con la copia también se resuelve fácilmente en la clase Arrays:
public class Main {

   public static void main(String[] args) {

       int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};

       int [] numbersCopy = Arrays.copyOf(numbers, numbers.length);
       System.out.println(Arrays.toString(numbersCopy));

   }
}
Al método Arrays.copyOf()le pasamos nuestra matriz original (de la cual necesitamos copiar los valores) y la longitud de la nueva matriz en la que copiamos los datos. En este caso, indicamos como longitud numbers.length, porque queremos copiar toda la matriz. Si queremos copiar solo los primeros elementos, podemos especificar una longitud menor para la nueva matriz:
public class Main {

   public static void main(String[] args) {

       int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};

       int [] numbersCopy = Arrays.copyOf(numbers, 4);
       System.out.println(Arrays.toString(numbersCopy));

   }
}
Aquí hemos especificado que la longitud de la nueva matriz sea 4. En consecuencia, solo los primeros 4 elementos numbersse copiarán en la nueva matriz. Salida de consola:

[167, -2, 16, 99]
Por cierto, si necesitas copiar parte de una matriz, pero no desde el principio, sino “desde el medio”, Arraystambién puedes hacer esto:
public class Main {

   public static void main(String[] args) {

       int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};

       int [] numbersCopy = Arrays.copyOfRange(numbers, 2,6);
       System.out.println(Arrays.toString(numbersCopy));

   }
}
Conclusión:

[16, 99, 26, 92]
Los números de las celdas dos ( inclusive ) a seis ( no inclusivas ) se copiaron en la nueva matriz. Además, es posible que necesitemos comparar dos matrices entre sí. Al igual que con el método toString(), las matrices en sí no anulan el método equals(). Entonces, si intentamos compararlos así:
public class Main {

   public static void main(String[] args) {

       int[] numbers = {1, 2, 3};
       int[] numbers2 = {1, 2, 3};

       System.out.println(numbers.equals(numbers2));
   }
}
obtenemos el resultado false. Object.equals()Después de todo, el método que compara enlaces se llamará . ¡Y por supuesto que son diferentes! Pero necesitamos comparar el contenido de las matrices, no los enlaces. La clase Arrayscontiene un método anulado equals()que hace exactamente lo que necesitamos:
public class Main {

   public static void main(String[] args) {

       int[] numbers = {1, 2, 3};
       int[] numbers2 = {1, 2, 3};

       System.out.println(Arrays.equals(numbers, numbers2));
   }
}
Conclusión:

true
Por cierto, la clase Arraysfunciona con éxito no sólo con matrices ordinarias, sino también con matrices bidimensionales:
public class Main {

   public static void main(String[] args) {

       int[][] numbers = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};

       int[][] numbersCopy = Arrays.copyOf(numbers, numbers.length);

       System.out.println("¿Son estas matrices bidimensionales iguales entre sí?");
       System.out.println(Arrays.deepEquals(numbers, numbersCopy));

       System.out.println(Arrays.deepToString(numbersCopy));
   }
}
Conclusión:

Равны ли эти двумерные массивы между собой?
true
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
Como puede ver, el método Arrays.copyOf()hizo frente a la copia de una matriz bidimensional. Tenga en cuenta que en este caso, al copiar una matriz bidimensional, se produce la llamada "copia superficial". Y para comparar matrices bidimensionales y enviarlas a la consola, se proporcionan métodos especiales: deepEqualsy deepToString(); En el futuro, verá más de una vez (y estará feliz por ello) que los creadores de Java previeron muchas situaciones típicas que los programadores encuentran cuando trabajan e implementaron soluciones listas para usar en el lenguaje. Usar estas soluciones es mucho más fácil y conveniente que reinventar ruedas, ¿verdad? :) Asegúrese de leer la documentación de la clase Arraysen el sitio web de Oracle . ¡Buena suerte con sus estudios!
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION