1.Arrays.fill()

Cuando se trabaja con arreglos, los programadores de Java a menudo necesitan llenar el arreglo con el mismo valor. Por supuesto, puede escribir un ciclo y simplemente asignar algún valor a cada celda de la matriz en el ciclo:

int[] x = new int[100];
for (int i = 0; i < x.length; i++)
x[i] = 999;

O simplemente puede llamar al Arrays.fill()método, que hace exactamente lo mismo: llena la matriz pasada con el valor pasado. Así es como se ve:

Arrays.fill(name, value)

Y el código del ejemplo anterior se puede hacer un poco más compacto y claro:

int[] x = new int[100];
Arrays.fill(x, 999);

También puede usar el Arrays.fill()método para llenar no toda la matriz, sino una parte de ella, con algún valor:

Arrays.fill(name, first, last, value)

Donde primero y último son los índices de la primera y última celda a llenar.

De acuerdo con la buena vieja tradición de Java, recuerde que el último elemento no está incluido en el rango.

Ejemplo:

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

Arrays.fill(x, 3, 7, 999);


String str = Arrays.toString(x);


Estamos llenando las celdas x[3], x[4], x[5]y x[6]con el valor 999. ¡Las celdas de una matriz se numeran a partir de cero!

La strvariable contiene el valor:
"[1, 2, 3, 999, 999, 999, 999, 8, 9, 10]"

El Arrays.fill()método solo funciona con matrices unidimensionales. Si pasa una matriz bidimensional al método, se tratará como unidimensional, con todas las consecuencias resultantes.



2.Arrays.copyOf()

Como ya sabe, no puede cambiar el tamaño de una matriz después de haberla creado.

Pero, ¿y si realmente quieres?

Bueno, si realmente quieres, ¡entonces puedes!

  • Crear una nueva matriz de la longitud deseada
  • Copie todos los elementos de la primera matriz en él.

Por cierto, esto es exactamente lo que Arrays.copyOf()hace el método. Esto es lo que parece llamarlo:

Type[] name2 = Arrays.copyOf(name, length);

Este método no cambia la matriz existente , sino que crea una nueva matriz y copia los elementos de la matriz anterior en ella.

Si los elementos no encajan (la longitud es menor que la longitud de la matriz existente ), los valores adicionales se ignoran.

Si la longitud de la nueva matriz es mayor que la longitud de la anterior, las celdas se llenan con ceros.

Ejemplo:

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

int[] x2 = Arrays.copyOf(x, 5);
String str2 = Arrays.toString(x2);

int[] x3 = Arrays.copyOf(x, 15);
String str3 = Arrays.toString(x3);


La str2variable contiene el valor:
"[1, 2, 3, 4, 5]"

La str3variable contiene el valor:
"[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 0, 0, 0, 0, 0]"

3.Arrays.copyOfRange()

¿Y qué sucede si desea obtener una matriz de longitud 5 a partir de una matriz de longitud 10, pero necesita que contenga los últimos 5 elementos en lugar de los primeros 5?

En este caso, Arraysserá útil otro método de la clase: el Arrays.copyOfRange(). Esto es lo que parece cuando lo llamamos:

Type[] name2 = Arrays.copyOfRange(name, first, last);

Este método también crea una nueva matriz, pero la llena con elementos de un lugar arbitrario en la matriz original. Donde primero y último son los índices de los elementos primero y último que deben colocarse en la nueva matriz.

De acuerdo con la buena vieja tradición de Java, recuerde que el último elemento no está incluido en el rango.

Ejemplo:

int[] x = {11, 12, 13, 14, 15, 16, 17, 18, 19, 20};

int[] x2 = Arrays.copyOfRange(x, 5, 10);
String str2 = Arrays.toString(x2);

int[] x3 = Arrays.copyOfRange(x, 5, 15);
String str3 = Arrays.toString(x3);


La str2variable contiene el valor:
"[16, 17, 18, 19, 20]"

La str3variable contiene el valor:
"[16, 17, 18, 19, 20, 0, 0, 0, 0, 0]"


4.Arrays.sort()

Ah, la delicia más deliciosa: clasificar . Las matrices se ordenan con bastante frecuencia en la programación. Las tres acciones más comunes cuando se trabaja con arreglos son:

  • Ordenar una matriz
  • Encontrar el elemento mínimo (o máximo) de una matriz
  • Determinar el índice de un elemento en una matriz (encontrar un elemento en una matriz)

Esta es precisamente la razón por la que los creadores de Java incluyeron el sort()método en la Arraysclase. Esto es lo que parece llamarlo:

Arrays.sort(name);

Este método ordena la matriz pasada en orden ascendente.

Ejemplo:

int[] x = {11, -2, 3, 0, 999, -20, 8, -20, 99, -20};

Arrays.sort(x);

String str = Arrays.toString(x);



La strvariable contiene el valor:
"[-20, -20, -20, -2, 0, 3, 8, 11, 99, 999]"

Excelente, ¿verdad? Llamó a un método y ahora tiene una matriz ordenada. Hermoso.

Por cierto, puede usar este método para ordenar no solo la matriz completa, sino solo una parte de ella. Esto es lo que parece llamarlo:

Arrays.sort(name, first, last);

Donde primero y último son los índices de la primera y la última celda que debe tocar la ordenación.

De acuerdo con la buena vieja tradición de Java, recuerde que el último elemento no está incluido en el rango.

Ejemplo:

int[] x = {11, -2, 3, 0, 999, -20, 8, -20, 99, -20};

Arrays.sort(x, 4, 8);
String str = Arrays.toString(x);


La strvariable contiene el valor:
"[11, -2, 3, 0, -20, -20, 8, 999, 99, -20]"

Para ordenar arreglos, Java utiliza el algoritmo de ordenación más rápido: QuickSort . Su complejidad computacional depende del tamaño de la matriz y se calcula mediante la fórmula N log(N).

Ordenar una matriz de 1000 elementos implicará unas 3000 comparaciones de elementos de la matriz. Ordenar una matriz de un millón de elementos implicará alrededor de 6 millones de comparaciones.



5.Arrays.binarySearch()

Bueno, y el último de los métodos más interesantes de la Arraysclase es capaz de buscar un valor dado en una matriz. Esta no es una búsqueda común, es la querida búsqueda binaria . Todo se reduce a esto:

  • Primero, se ordena la matriz.
  • Luego, el elemento central de la matriz se compara con el que estamos buscando.
  • Si el elemento es mayor que el elemento del medio, la búsqueda continúa en la mitad derecha de la matriz.
  • Si el elemento que estamos buscando es menor que el elemento del medio, la búsqueda continúa en la mitad izquierda de la matriz.

Debido a que la matriz está ordenada, es posible eliminar la mitad en una sola comparación. Luego, en el siguiente paso, tiramos otra mitad, y así sucesivamente.

Este enfoque hace que la búsqueda binaria sea muy rápida. En una matriz de un millón (!) de elementos, puede encontrar el índice del elemento deseado en solo 20 comparaciones. La deficiencia del enfoque es que primero se debe ordenar la matriz, y la ordenación también lleva tiempo.

Esto es lo que parece llamarlo:

int index = Arrays.binarySearch(name, value);

Donde nameestá el nombre de la matriz, que debe pasarse ya ordenada (por ejemplo, usando el Arrays.sort()método). Y valuees el elemento que estamos buscando en la matriz. El resultado devuelto por el método es el índice del elemento de matriz deseado .

Ejemplos:

int[] x = {11, -2, 3, 0, 999, -20, 8, -20, 99, -20};
Arrays.sort(x);

int index1 = Arrays.binarySearch(x, 0);
int index2 = Arrays.binarySearch(x, -20);
int index3 = Arrays.binarySearch(x, 99);
int index4 = Arrays.binarySearch(x, 5);
xes:
{-20, -20, -20, -2, 0, 3, 8, 11, 99, 999}

4
1(índices 0y 2también son aceptables)
8
-7

Si la matriz contiene varias instancias del elemento que se busca, el algoritmo simplemente devolverá el índice de una de ellas (no hay garantía de que sea, por ejemplo, la primera, o viceversa, la última de estas). elementos duplicados)."

Si el elemento no se encuentra en la matriz, el índice será negativo.



6. Enlace a la documentación de Oracle sobre la Arraysclase

Si está muy interesado, puede leer todo sobre la Arraysclase y todos sus métodos en la documentación oficial a href="https://docs.oracle.com/en/java/javase/14/docs/api/java.base /java/util/Arrays.html">en el sitio web de Oracle.

Por ejemplo, puede leer sobre los métodos Arrays.mismatch()y Arrays.compare(). Tal vez los encuentre útiles de alguna manera.

Y no se confunda por la cantidad de métodos. Cada método tiene de 5 a 10 variantes, que difieren solo en sus tipos de parámetros.