"Rishi, tengo muchas ganas de aprender sobre el resto de los métodos de la clase Arrays.

"¡Tal celo por aprender no puede sino complacer a tu antiguo maestro! Pero, si realmente quieres averiguarlo todo, un amable mago llamado Google te ayudará día y noche".

"Oh..."

"Es broma. Más o menos. Por supuesto, explicaré todo mejor, pero si surge algo, recuerda al buen mago. Comenzaré la lección de hoy con el Arrays.fillmétodo

"Cuando se trabaja con matrices, los programadores de Java a menudo necesitan llenar la matriz 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 en lugar de todo esto, 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);

"¡Hermoso!"

"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 la última celda a llenar.

De acuerdo con la vieja tradición buena (o mala) 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.

Arrays.copyOf()

"Amigo, ¿dime cómo cambiar el tamaño de una matriz después de haberla creado?"

"Umm... Esa es una pregunta capciosa, ¿verdad? Ya no soy tan inexperto. ¡La respuesta correcta es que no puedes! No puedes cambiar el tamaño de una matriz después de haberla creado".

"Pero, ¿y si realmente quieres?"

"¡Todavía es imposible!

"En realidad, si realmente quieres, ¡entonces puedes! Con la ayuda de un truco de programación:

  1. Primero, crea una nueva matriz de la longitud deseada
  2. Luego copia todos los elementos de la primera matriz en ella.

"Estas son las dos cosas que Arrays.copyOf()hace el método. Así es como se ve 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".

"¿Qué pasa si la longitud de la nueva matriz es menor que la longitud de la existente ?

"¡Buena pregunta, Amigo! Si los elementos no encajan, simplemente se ignoran los valores adicionales".

"Y si, por el contrario, hay células de más, ¿cuáles son sus valores iniciales?

"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 La variable contiene el valor
"[1, 2, 3, 4, 5]"

str3
"[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 0, 0, 0, 0, 0]"

Arrays.copyOfRange()

"¿Y qué sucede si desea obtener una matriz de longitud 5 de una matriz de longitud 10, pero necesita que contenga los últimos 5 elementos en lugar de los primeros 5? En este caso, necesita otro método de la clase. ArraysEs Arrays.copyOfRange()Así es como se ve llamarlo:

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 del primer y último elemento que deben colocarse en la nueva matriz. ¿Puede decirme si el último elemento está incluido en este rango?"

"¡Ja! Como solía decir mi gran maestro, ' de acuerdo con la buena (o mala) vieja tradición de Java, recuerda que el último elemento no está incluido en el rango '".

"Amigo, estás creciendo ante nuestros ojos.

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 La variable contiene el valor
"[16, 17, 18, 19, 20]"

str3
"[16, 17, 18, 19, 20, 0, 0, 0, 0, 0]"

Arrays.sort()

"Y finalmente, dejé el método más... mmm... agradable para el final: ordenar . Las matrices se ordenan con bastante frecuencia en la programación. Estas son las 3 acciones más populares cuando se trabaja con matrices:

  • 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)

"Los algoritmos de clasificación que funcionan bien, debo decir, no son tan fáciles de escribir. Más precisamente, esta es una tarea estándar, y como estudiante, no te hará daño practicar escribiendo algoritmos de clasificación a veces. Pero en el trabajo, es mejor no perder el tiempo reinventando la rueda. Los creadores de Java incluyeron el sort()método en la Arraysclase. Así es como se ve 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! Llamé a un solo método y la matriz está ordenada. ¡Una cosa hermosa!"

"Por cierto, puede ordenar no solo la matriz completa, sino también solo una parte de ella. Así es como se ve llamar:

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. Y...

"¡Ya sé lo que vas a decir! 'De acuerdo con la buena (o mala) vieja tradición de Java, recuerda 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 clasificar matrices, Java utiliza el algoritmo de clasificació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 10 000 comparaciones de elementos de la matriz. Ordenar una matriz de un millón de elementos implicará unas 20 millones de comparaciones".

No hay demasiadas comparaciones cuando consideras la cantidad de elementos!"

"Eso es exactamente lo que estoy diciendo. El algoritmo QuickSort es muy eficiente.

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 ordinaria, es la amada búsqueda binaria . 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, descartamos otra mitad, y así sucesivamente".

"¡Fantástico! ¡Nos movemos directamente a la meta muy rápido!"

"Exactamente. En una matriz de un millón (!) de elementos, el algoritmo de búsqueda binaria puede encontrar el índice del elemento deseado en solo 20 comparaciones. La deficiencia del algoritmo es que primero se debe ordenar la matriz, y la clasificación también lleva tiempo.

Esto es lo que parece llamarlo:

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

"Dónde nameestá el nombre de la matriz, que debe pasarse ya ordenado (por ejemplo, usando el Arrays.sort()método). Y valuees el elemento que buscamos en la matriz. El resultado que devuelve el método es el índice del elemento deseado de la matriz .

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

"¿Qué pasa si el elemento deseado aparece varias veces en la matriz ?"

"Esa es una pregunta válida, Amigo. En este caso, el algoritmo devolverá el índice de uno de ellos (no hay garantía de que sea, digamos, el primero, o viceversa, el último de estos elementos duplicados) ."

"¿Qué pasa si la matriz no contiene el elemento deseado en absoluto?"

"En este caso, el algoritmo devolverá un índice negativo .

Documentación

"¡Todo está claro, Rishi! Esto fue muy interesante".

"Si realmente encontró esto muy interesante, entonces en su tiempo libre hojee la documentación oficial de la Arraysclase y sus métodos en el sitio web de Oracle .

"Puede echar un vistazo más de cerca, por ejemplo, a los métodos Arrays.mismatch()y Arrays.compare(). Lo más probable es que pueda darles un buen uso.

"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".