lunes, 9 de marzo de 2015

Copiar y comparar ARRAYS

Al trabajar con arrays de tipos primitivos o de objetos se nos puede plantear la necesidad de copiar arrays. La copia de arrays está permitida pero conviene ser cauto cuando realicemos procesos de este tipo. Recordar que un array es un objeto (aunque sea especial) y por tanto la variable que lo nombra en realidad contiene un puntero al objeto, no el objeto en sí mismo.
 

Al hacer una operación del tipo array1 = array2, el puntero de array1 apunta al mismo objeto que array2 mientras que el objeto al que apuntaba array1 queda inaccesible. A partir de ese momento existe identidad entre los arrays y la comparación usando == nos devolverá true. A través de código, vamos a plantearnos distintas situaciones y a comentar cuáles son los resultados.


EJERCICIO EJEMPLO RESUELTO 1. COPIAR ESTABLECIENDO UNA RELACIÓN DE IDENTIDAD ENTRE ARRAYS (aplicable a arrays de tipos primitivos y a arrays de objetos)
//Test de copia de arrays aprenderaprogramar.com
public class TestCopiaArrays {
    public static void main (String [ ] Args) {
        int [ ] miArray1 = {2, -4, 3, -7};
        for (int i=0; i<miArray1.length; i++) {
            System.out.print ("miArray1[" + i +"]= " + miArray1[i]+"; ");
        }
        System.out.println("");
        int [ ] otroArray = {1, 2, 4, 8};
        for (int i=0; i<otroArray.length; i++) {
            System.out.print ("otroArray[" + i +"]= " + otroArray[i]+"; ");}
        System.out.println("");
        System.out.println ("¿Son el mismo objeto? ... " + (miArray1==otroArray) );
        System.out.println("");
        otroArray = miArray1;   //otroArray pasa a ser el mismo objeto que miArray1
        for (int i=0; i<otroArray.length; i++) {
            System.out.print ("otroArray[" + i +"]= " + otroArray[i]+"; ");}
        System.out.println("");
        System.out.println ("¿Son el mismo objeto? ... " + (miArray1==otroArray) );
    } //Cierre del main
//Cierre de la clase


Trata de predecir tú mismo el resultado y compáralo con el que ofrecemos. Resultado:
miArray1[0]= 2; miArray1[1]= -4; miArray1[2]= 3; miArray1[3]= -7;
otroArray[0]= 1; otroArray[1]= 2; otroArray[2]= 4; otroArray[3]= 8;
¿Son el mismo objeto? ... false
otroArray[0]= 2; otroArray[1]= -4; otroArray[2]= 3; otroArray[3]= -7;
¿Son el mismo objeto? ... true


EJERCICIO EJEMPLO RESUELTO 2. INTENTO DE COMPARAR ARRAYS (RELACIÓN DE IGUALDAD)
Supongamos que queremos comparar la igualdad entre dos arrays. Una idea (mala idea) podría ser aplicar el método equals directamente sobre el array. Un código de prueba podría ser este:
//Test uso incorrecto de equals aprenderaprogramar.com
public class TestUsoIncorrectoEquals {
    public static void main (String [ ] Args) {
        int [ ] miArray1 = {2, -4, 3, -7};
        for (int i=0; i < miArray1.length; i++) {
            System.out.print ("miArray1[" + i +"]= " + miArray1[i]+"; ");
        }
             System.out.println();
        int [ ] otroArray = {2, -4, 3, -7};
        for (int i=0; i < otroArray.length; i++) {
            System.out.print ("otroArray[" + i +"]= " + otroArray[i]+"; ");
        }
 System.out.println ("¿Son el mismo objeto? ... " + (miArray1==otroArray) );
 System.out.println ("¿Tienen el mismo contenido (relación de igualdad)? ... " + (miArray1.equals(otroArray) ) );
 otroArray = miArray1;   //otroArray pasa a ser el mismo objeto que miArray1
        for (int i=0; i<otroArray.length; i++) {  System.out.print ("otroArray[" + i +"]= " + otroArray[i]+"; ");  }
System.out.println ("¿Son el mismo objeto? ... " + (miArray1==otroArray) );
        System.out.println ("¿Tienen el mismo contenido (relación de igualdad)? ... " + (miArray1.equals(otroArray) ) );
    } //Cierre del main
//Cierre de la clase


Trata de predecir tú mismo el resultado y compáralo con el que ofrecemos. Resultado:
miArray1[0]= 2; miArray1[1]= -4; miArray1[2]= 3; miArray1[3]= -7;
otroArray[0]= 2; otroArray[1]= -4; otroArray[2]= 3; otroArray[3]= -7; ¿Son el mismo objeto? ... false
¿Tienen el mismo contenido (relación de igualdad)? ... false
otroArray[0]= 2; otroArray[1]= -4; otroArray[2]= 3; otroArray[3]= -7; ¿Son el mismo objeto? ... true
¿Tienen el mismo contenido (relación de igualdad)? ... true


Con este ejemplo comprobamos que el método equals aplicado directamente sobre arrays no funciona ya que en el primer caso teniendo el mismo contenido nos dice que la relación de igualdad es falsa. ¿Por qué? Porque ya dijimos en su momento que los arrays son unos objetos especiales que no tienen una clase que los implemente. Si no tienen clase, no tienen métodos (al menos directamente), y el método que se aplica es el usado por defecto por Java con resultados imprevisibles o no deseados. La solución para comparar arrays es usar otra clase que permite realizar operaciones con arrays. Esta clase es la clase Arrays. Una vez más la terminología Java nos puede inducir a confusión: hablamos de array como colección de tipos primitivos u objetos, y al mismo tiempo Arrays (con mayúsculas) es el nombre de una clase Java que sirve para manipular arrays.


Fuente:enlace
Si quieres seguir aprendiendo con nosotros, puedes ingresar a nuestros 
Cursos y Diplomados de Tecnología Web visita www.uneweb.edu.ve  para más información

No hay comentarios:

Publicar un comentario

Entradas populares