4 La clase Arrays¶
Introducción¶
En el paquete java.utils se encuentra la clase Arrays. Esta clase contiene métodos estáticos para manipular arrays, como por ejemplo, búsquedas, comparaciones, copias y ordenaciones.
Contenido de un array¶
-
Método toString: devuelve una representación en cadena del contenido del array especificado. Dicha cadena está formada por los elementos del array entre corchetes y separados por comas. Es muy útil para sacar por consola la información sobre el array. Se utiliza con arrays unidimensionales.
-
Método deepToString: igual que el anterior pero para arrays multidimensionales:
public class DeepToString { public void show(){ int[][] twoDimensions = { {0, 1, 2, 3, 4}, {5, 6, 7, 8, 9}, {10, 11, 12, 13, 14} }; System.out.println(Arrays.deepToString(twoDimensions)); // [[0, 1, 2, 3, 4], [5, 6, 7, 8, 9], [10, 11, 12, 13, 14]] } public static void main(String[] args) { new DeepToString().show(); } }
Rellenar un array¶
El método fill permite rellenar todo un array unidimensional con un determinado valor. También tiene una versión sobrecargado para especificar un rango.
public class Fill {
public void show(){
int[] array = new int[6];
Arrays.fill(array, 1);
System.out.println(Arrays.toString(array)); // [1, 1, 1, 1, 1, 1]
Arrays.fill(array, 2, 5, 0);
System.out.println(Arrays.toString(array)); // [1, 1, 0, 0, 0, 1]
}
public static void main(String[] args) {
new Fill().show();
}
}
Búsquedas¶
El método binarySearch:
- permite buscar un elemento de forma ultra rápida en un array ordenado (en un array desordenado, sus resultados son impredecibles)
- Devuelve el índice en el que está colocado el elemento.
- Si el elemento no se encuentra, devuelve un número negativo.
- Si el array contiene múltiples elementos con el valor especificado, no hay garantía de cuál será encontrado.
- Está sobrecargado para buscar en un determinado rango del array. Se proporcionan dos parámetros más para especificar el rango:
- fromIndex: el índice (incluido) de la parte inferior del rango.
- toIndex: el índice (excluido) de la parte superior del rango.
public class BinarySearch {
public void show(){
int lowerRange, higherRange;
int[] array = {3, 4, 5, 6, 7, 8};
int number = 9;
int index = Arrays.binarySearch(array, number);
if(index >= 0){
System.out.printf("El número %d se encuentra en el índice %d\n", number, index);
} else {
System.out.printf("El número %d no se encuentra en el array\n", number);
}
lowerRange = 3;
higherRange = 6; // Como está excluido, se busca hasta el índice 5
index = Arrays.binarySearch(array, lowerRange, higherRange, number);
if(index >= 0){
System.out.printf("El número %d se encuentra en el índice %d\n", number, index);
} else {
System.out.printf("El número %d no se encuentra en el array\n", number);
}
}
public static void main(String[] args) {
new BinarySearch().show();
}
}
Comparaciones¶
Además de los métodos, equals para los arrays unidimensionales, y deepEquals para los multidimensionales, existen otros métodos para comparar:
-
Método compare: compara dos arrays lexicográficamente. También tiene una versión sobrecargada para especificar un rango. Devuelve: - el valor 0: si los dos arrays son iguales y contienen los mismos elementos en el mismo orden. - un número negativo: si el primer array es lexicográficamente inferior al segundo. - un número positivo: si el primer array es lexicográficamente superior al segundo.
public class Compare { public void show(){ int result; boolean[] arrayBoolean1 = {true, true, false}; boolean[] arrayBoolean2 = {true, true, false}; char[] arrayChar1 = {'m', 'n', 't'}; char[] arrayChar2 = {'m', 'n', 'a'}; char[] arrayChar3 = {'M', 'n', 't'}; int[] arrayInt1 = {3, 4, 5}; int[] arrayInt2 = {3, 4, 5}; int[] arrayInt3 = {3, 4, 5, 6}; result = Arrays.compare(arrayBoolean1, arrayBoolean2); System.out.printf("El resultado de comparar %s y %s es: ", Arrays.toString(arrayBoolean1), Arrays.toString(arrayBoolean2)); comparison(result); result = Arrays.compare(arrayChar1, arrayChar2); System.out.printf("El resultado de comparar %s y %s es: ", Arrays.toString(arrayChar1), Arrays.toString(arrayChar2)); comparison(result); result = Arrays.compare(arrayChar3, arrayChar2); System.out.printf("El resultado de comparar %s y %s es: ", Arrays.toString(arrayChar3), Arrays.toString(arrayChar2)); comparison(result); result = Arrays.compare(arrayInt1, arrayInt2); System.out.printf("El resultado de comparar %s y %s es: ", Arrays.toString(arrayInt1), Arrays.toString(arrayInt2)); comparison(result); result = Arrays.compare(arrayInt1, arrayInt3); System.out.printf("El resultado de comparar %s y %s es: ", Arrays.toString(arrayInt1), Arrays.toString(arrayInt3)); comparison(result); result = Arrays.compare(arrayInt1,0, 3 ,arrayInt3, 0, 3); System.out.printf("El resultado de comparar %s y %s en el rango 0-2 es: ", Arrays.toString(arrayInt1), Arrays.toString(arrayInt3)); comparison(result); } public void comparison(int result){ if(result == 0){ System.out.println("los arrays son iguales"); } else if(result < 0){ System.out.println("el primer array es menor"); } else { System.out.println("el primer array es mayor"); } } public static void main(String[] args) { new Compare().show(); } }
-
Método mismatch: encuentra y devuelve el índice de la primera diferencia entre dos arrays. Si no encuentra ninguna diferencia, devuelve -1. También tiene una versión sobrecargada para especificar un rango.
public class Mismatch {
public void show(){
int[] array1 = {3, 4, 5, 6, 7, 8};
int[] array2 = {3, 4, 5, 6, 7, 8};
int[] array3 = {3, 4, 5, 6, 7, 8, 9, 10, 11};
int indexMismatch;
indexMismatch = Arrays.mismatch(array1, array2);
if(indexMismatch == -1){
System.out.printf("%s y %s son iguales\n", Arrays.toString(array1), Arrays.toString(array2));
} else {
System.out.printf("%s y %s tienen su primera diferencia en el elemento %d\n",
Arrays.toString(array1), Arrays.toString(array2), indexMismatch);
}
indexMismatch = Arrays.mismatch(array1, array3);
if(indexMismatch == -1){
System.out.printf("%s y %s son iguales\n", Arrays.toString(array1), Arrays.toString(array3));
} else {
System.out.printf("%s y %s tienen su primera diferencia en el elemento %d\n",
Arrays.toString(array1), Arrays.toString(array3), indexMismatch);
}
indexMismatch = Arrays.mismatch(array1, 2, 6, array3, 2, 6);
if(indexMismatch == -1){
System.out.printf("%s y %s son iguales en el rango 2-5\n", Arrays.toString(array1), Arrays.toString(array2));
} else {
System.out.printf("%s y %s tienen su primera diferencia en el elemento %d en el rango 2-5\n",
Arrays.toString(array1), Arrays.toString(array2), indexMismatch);
}
}
}
Copias¶
-
Método copyOf: obtiene una copia de un array. Recibe dos parámetros, el array a copiar y el tamaño del array resultante. De mode que: - si el tamaño es menor que el del array original: sólo obtiene una copia de los primeros elementos, tantos como indique el tamaño. - si el tamaño es mayor que el original: devuelve un array en el que los elementos superan al original se rellenaran con el valor por defecto según el tipo de datos del array.
public class CopyOf { public void show(){ int[] array1 = {3, 4, 5, 6, 7, 8, 9, 10}; int[] array2 = Arrays.copyOf(array1, 5); int[] array3 = Arrays.copyOf(array1, 10); System.out.println(Arrays.toString(array2)); // [3, 4, 5, 6, 7] System.out.println(Arrays.toString(array3)); // [3, 4, 5, 6, 7, 8, 9, 10, 0, 0] } public static void main(String[] args) { new CopyOf().show(); } }
-
Método copyOfRange: obtiene una copia de un array especificando el rango, es decir, de qué elemento a qué elemento se hace la copia.
Ordenaciones¶
El método sort ordena un array de forma ascendente. También tiene una versión sobrecargada para especificar un rango.
public class Sort {
public void show(){
int[] array1 = {8, 4, 3, 7, 5, 6};
int[] array2 = {8, 4, 3, 7, 5, 6};
Arrays.sort(array1);
System.out.println(Arrays.toString(array1)); // [3, 4, 5, 6, 7, 8]
Arrays.sort(array2,1 ,5);
System.out.println(Arrays.toString(array2)); // [8, 3, 4, 5, 7, 6]
}
public static void main(String[] args) {
new Sort().show();
}
}