Creación de clases

prev.gif (997 bytes)chapter.gif (1105 bytes)home.gif (1054 bytes)next.gif (998 bytes)

Clases y objetos

Definición de la clase Lista

Objetos de la clase Lista


Crear una clase denominada Lista cuyo miembro dato sea un array de números enteros y cuyas funciones miembro realicen las siguientes tareas:

disco.gif (1035 bytes)lista: Lista.java, ListaApp.java

 

Definición de la clase Lista

Empezamos la definición de la clase escribiendo la palabra reservada class y a continuación el nombre de la clase Lista.

Los miembros dato

Los miembros dato de la clase Lista serán un array de enteros x, y opcionalmente la dimensión del array n.

public class Lista {
    int[] x;     //array de datos
    int n;      //dimensión


El constructor

Al constructor de la clase Lista se le pasará un array de enteros para inicializar los miembros dato

    public Lista(int[] x) {
        this.x=x;
        n=x.length;
    }

Como apreciamos basta una simple asignación para inicializar el miembro dato x que es un array de enteros, con el array de enteros x que se le pasa al constructor. Por otra parte, cuando se le pasa a una función un array se le pasa implícitamente la dimensión del array, que se puede obtener a partir de su miembro dato length.

Las funciones miembro

Las funciones miembro tienen acceso a los miembros dato, el array de enteros x y la dimensión del array n.

Para hallar el valor medio, se suman todos los elementos del array y se divide el resultado por el número de elementos.

    double valorMedio(){
        int suma=0;
        for(int i=0; i<n; i++){
            suma+=x[i];
        }
        return (double)suma/n;
    }

Para codificar esta función se ha de tener algunas precauciones. La suma de todos los elementos del array se guarda en la variable local suma. Dicha variable local ha de ser inicializada a cero, ya que una variable local contrariamente a lo que sucede a los miembros dato o variables de instancia es inicializada con cualquier valor en el momento en que es declarada.

La división de dos enteros suma y n (número de elementos del array) es un número entero. Por tanto, se ha de promocionar el entero suma de int a double para efectuar la división y devolver el resultado de esta operación.

    int valorMayor(){
        int mayor=x[0];
        for(int i=1; i<n; i++){
            if(x[i]>mayor)  mayor=x[i];
        }
        return  mayor;
    }

Se compara cada elemento del array con el valor de la variable local mayor, que inicialmente tiene el valor del primer elemento del array, si un elemento del array es mayor que dicha variable auxiliar se guarda en ella el valor de dicho elemento del array. Finalmente, se devuelve el valor mayor calculado

    int valorMenor(){
        int menor=x[0];
        for(int i=1; i<n; i++){
            if(x[i]<menor)  menor=x[i];
        }
        return  menor;
    }

El código es similar a la función valorMayor

intercambio.gif (2714 bytes) En el proceso de ordenación se ha de intercambiar los valores que guardan elementos del array. Veamos como sería el código correspondiente al intercambio de los valores que guardan dos variables x e y.

Para intercambiar el contenido de dos recipientes x e y sin que se mezclen, precisamos de un recipiente auxiliar aux vacío. Se vuelca el contenido del recipiente x en el recipiente aux, el recipiente y se vuelca en x, y por último, el recipiente aux se vuelca en y. Al final del proceso, el recipiente aux vuelve a estar vacío como al principio. En la figura se esquematiza este proceso.

	aux=x;
	x=y;
	y=aux;

 

ordenar.gif (2050 bytes) Para ordenar una lista de números emplearemos el método de la burbuja, un método tan simple como poco eficaz. Se compara el primer elemento, índice 0, con todos los demás elementos de la lista, si el primer elemento es mayor que el elemento j, se intercambian sus valores, siguiendo el procedimiento explicado en la figura anterior. Se continua este procedimiento con todos los elementos del array menos el último. La figura explica de forma gráfica este procedimiento.
    void ordenar(){
        int aux;
        for(int i=0; i<n-1; i++){
            for(int j=i+1; j<n; j++){
                if(x[i]>x[j]){
                    aux=x[j];
                    x[j]=x[i];
                    x[i]=aux;
                }
            }
        }
    }

Caben ahora algunas mejoras en el programa, así la función ordenar la podemos utilizar para hallar el valor mayor, y el valor menor. Si tenemos una lista ordenada en orden ascendente, el último elemento de la lista será el valor mayor y el primero, el valor menor. De este modo, podemos usar una función en otra funciones, lo que resulta en un ahorro de código, y en un aumento de la legibilidad del programa.

    int valorMayor(){
        ordenar();
        return  x[n-1];
    }
    int valorMenor(){
        ordenar();
        return  x[0];
    }

Imprimimos la lista ordenada separando sus elementos por un tabulador. Primero, se llama a la función ordenar, y despues se imprime un elemento a continuación del otro mediante System.out.print. Recuérdese, que System.out.println imprime y a continuación pasa a la siguiente línea.

    void imprimir(){
        ordenar();
        for(int i=0; i<n; i++){
            System.out.print("\t"+x[i]);
        }
        System.out.println("");
    }

El código completo de la clase Lista, es el siguiente

public class Lista {
    int[] x;     //array de datos
    int n;      //dimensión
    public Lista(int[] x) {
        this.x=x;
        n=x.length;
    }
    double valorMedio(){
        int suma=0;
        for(int i=0; i<n; i++){
            suma+=x[i];
        }
        return (double)suma/n;
    }
    int valorMayor(){
        int mayor=x[0];
        for(int i=1; i<n; i++){
            if(x[i]>mayor)  mayor=x[i];
        }
        return  mayor;
    }
    int valorMenor(){
        int menor=x[0];
        for(int i=1; i<n; i++){
            if(x[i]<menor)  menor=x[i];
        }
        return  menor;
    }
    void ordenar(){
        int aux;
        for(int i=0; i<n-1; i++){
            for(int j=i+1; j<n; j++){
                if(x[i]>x[j]){
                    aux=x[j];
                    x[j]=x[i];
                    x[i]=aux;
                }
            }
        }
    }
    void imprimir(){
        ordenar();
        for(int i=0; i<n; i++){
            System.out.print("\t"+x[i]);
        }
        System.out.println("");
    }
}

 

Los objetos de la clase Lista

A partir de un array de enteros podemos crear un objeto lista de la clase Lista.

        int[] valores={10, -4, 23, 12, 16};
        Lista lista=new Lista(valores);

Estas dos sentencias las podemos convertir en una

        Lista lista=new Lista(new int[] {10, -4, 23, 12, 16});

En el resto del código, el objeto lista llama a las funciones miembro

        System.out.println("Valor mayor "+lista.valorMayor());
        System.out.println("Valor menor "+lista.valorMenor());
        System.out.println("Valor medio "+lista.valorMedio());
        lista.imprimir();