Ejemplo de clases compuestas Java

En esta entrada vamos a resolver el mismo ejercicio de clases compuestas planteado en el ejercicio anterior con las clases Fecha y Persona pero en este caso los objetos se van a almacenar en un array en lugar de hacerlo en un ArrayList.
El código de las clases Fecha y Persona es el mismo que en el ejercicio anterior. 
//Clase Fecha
public class Fecha {

    private int dia;
    private int mes;
    private int año;

    //Constructor por defecto
    public Fecha() {
    }

    //Constructor con parámetros
    public Fecha(int dia, int mes, int año) {
        this.dia = dia;
        this.mes = mes;
        this.año = año;
    }

    //Constructor copia
    public Fecha(Fecha fecha) {
        this.dia = fecha.dia;
        this.mes = fecha.mes;
        this.año = fecha.año;
    }

    //Métodos get y set
    public int getDia() {
        return dia;
    }

    public void setDia(int dia) {
        this.dia = dia;
    }

    public int getMes() {
        return mes;
    }

    public void setMes(int mes) {
        this.mes = mes;
    }

    public int getAño() {
        return año;
    }

    public void setAño(int año) {
        this.año = año;
    }

    //Método para comprobar si la fecha es correcta
    public boolean fechaCorrecta() {
        boolean diaCorrecto, mesCorrecto, añoCorrecto;
        añoCorrecto = this.año > 0;
        mesCorrecto = this.mes >= 1 && this.mes <= 12;
        switch (this.mes) {
            case 2 -> {
                if (esBisiesto()) {
                    diaCorrecto = this.dia >= 1 && this.dia <= 29;
                } else {
                    diaCorrecto = this.dia >= 1 && this.dia <= 28;
                }
            }
            case 4, 6, 9, 11 -> diaCorrecto = this.dia >= 1 && this.dia <= 30;
            default ->  diaCorrecto = this.dia >= 1 && this.dia <= 31;
        }
        return diaCorrecto && mesCorrecto && añoCorrecto;
    }

    //Método para comprobar si el año es bisiesto
    //Método privado invocado desde el método fechaCorrecta
    private boolean esBisiesto() {
        return (this.año % 4 == 0 && this.año % 100 != 0 || this.año % 400 == 0);                                 
    }

    //Método para comprobar si la fecha es menor que la que se recibe                                             
    public boolean esMenorQue(Fecha f) {
        if (this.año < f.año) {
            return true;
        }
        if (this.año == f.año && this.mes < f.mes) {
           return true;
        }
        return this.año == f.año && this.mes == f.mes && this.dia < f.dia;
    }

    //Método para mostrar la fecha
    //Devuelve un String con la fecha en formato dd-mm-aa
    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append(String.format("%02d-%02d-%02d", dia, mes, año));
        return sb.toString();
    }
} //Final de la Clase Fecha
import java.time.LocalDate;

//Clase Persona
public class Persona {
    private String nombre;
    private String poblacion;
    private Fecha fechaNacimiento;

    //Constructor por defecto
    public Persona() {
        fechaNacimiento = new Fecha();
    }

    //Constructor con todos los parámetros
    public Persona(String nombre, String poblacion, Fecha fechaNacimiento) {
        this.nombre = nombre;
        this.poblacion = poblacion;
        this.fechaNacimiento = new Fecha(fechaNacimiento);
    }
    
    //Métodos get y set
    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public String getPoblacion() {
        return poblacion;
    }

    public void setPoblacion(String poblacion) {
        this.poblacion = poblacion;
    }

    public Fecha getFechaNacimiento() {
        return fechaNacimiento;
    }

    public void setFechaNacimiento(Fecha fechaNacimiento) {
        this.fechaNacimiento = new Fecha(fechaNacimiento);
    }
    
    //Método para comprobar si la persona es mayor de edad
    public boolean esMayorDeEdad() {
        LocalDate hoy = LocalDate.now();
        int añoActual = hoy.getYear();
        int mesActual = hoy.getMonthValue();
        int diaActual = hoy.getDayOfMonth();
        if (añoActual - fechaNacimiento.getAño() > 18) {
            return true;
        } else if (añoActual - fechaNacimiento.getAño() == 18 &&
                   mesActual > fechaNacimiento.getMes()) {
            return true;
        } else if (añoActual - fechaNacimiento.getAño() == 18 &&
                   mesActual == fechaNacimiento.getMes() &&
                   diaActual >= fechaNacimiento.getDia()) {
            return true;
        }
        return false;
    }
    
    //Método para mostrar los datos de las personas según el formato pedido                                       
    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append("Nombre: ");
        sb.append(nombre);
        sb.append("\nPoblación: ");
        sb.append(poblacion);
        sb.append("\nFecha de Nacimiento: ");
        sb.append(fechaNacimiento);
        return sb.toString();
    }
} //Final de la clase Persona
Clase Principal
En la clase principal hay que modificar el código para adaptarlo de forma que los objetos se guarden en un array en lugar de un ArrayList.
Para poder crear el array tenemos que saber antes el número de personas que vamos a introducir, por lo tanto el array tendremos que crearlo dentro del método leerPersonas(). En ese método se pide el número total de personas a leer. Una vez conocido ese número podremos crear un array de tipo Persona de ese tamaño.
Para poder acceder al array desde todos los métodos sin necesidad de pasarlo como parámetro, se declara el array personas como static pero no se crea (no se le da tamaño) ya que en ese momento no sabemos el tamaño que va a tener.
El código de la clase principal será ahora este:
import java.util.Scanner;

public class EjemploClaseCompuesta2 {

    //se declara el array de Personas
    static Persona [] personas;

    //creamos un Scanner para la lectura de datos por teclado
    static Scanner sc = new Scanner(System.in);

    public static void main(String[] args) {
        //se introducen las personas en el ArrayList
        leerPersonas();

        //se muestran todas las personas introducidas
        System.out.println("\nPersonas introducidas: ");
        mostrarPersonas();

        //se muestra la persona de mayor edad
        System.out.println("\nPersona de mayor edad: ");
        System.out.println(personaDeMayorEdad());

        //Se muestra el número de personas que viven en una población
        String poblacion;
        System.out.println("\nPersonas que viven en una población");
        System.out.print("Introduzca población: ");
        poblacion = sc.nextLine();
        System.out.println("\nNúmero de personas que viven en " + poblacion + ": "
                + cuantasPersonasVivenEn(poblacion));

        //se muestra el número de personas mayores de edad
        System.out.println("\nNúmero de personas mayores de edad : "
                + personasMayoresDeEdad());

    }

    //Método para introducir personas en el array
    //primero se se introduce por teclado el número total de personas a leer
    //a continuación se crea el array con ese tamaño
    //Una vez creado el array ya podemos crear los objetos Persona
    //introducir sus datos por teclado y añadirlos al array
  
    public static void leerPersonas() {
        String nombre, poblacion;
        Fecha fecha;
        Persona p;
        int total, i, dia, mes, año;
        //se pide cuántas personas en total vamos a introducir
        do {
            System.out.print("Número de personas? ");
            total = sc.nextInt();
        } while (total < 1);
        sc.nextLine(); //limpiar el buffer de entrada

        //se crea un array de Personas de ese tamaño
        personas = new Persona[total];
        
        //Bucle para crear las Personas, introducir sus datos por teclado 
        //y almacenarlas en el ArrayList
        for (i = 0; i < total; i++) {
            System.out.println("Persona " + (i + 1));
            //se introduce por teclado el nombre de la persona
            System.out.print("Nombre: ");
            nombre = sc.nextLine();
            //se introduce por teclado la población
            System.out.print("Población: ");
            poblacion = sc.nextLine();

            //se introduce por teclado la fecha de nacimiento: dia, mes y año
            do {
                System.out.println("Fecha de Nacimiento: ");
                System.out.print("Dia: ");
                dia = sc.nextInt();
                System.out.print("Mes: ");
                mes = sc.nextInt();
                System.out.print("Año: ");
                año = sc.nextInt();
                //se crea un objeto Fecha
                fecha = new Fecha(dia, mes, año);
            } while (!fecha.fechaCorrecta());//se comprueba si la fecha es correcta

            sc.nextLine();//limpiar el buffer de entrada

            //se crea una nueva instancia de Persona mediante el constructor con parámetros
            p = new Persona(nombre, poblacion, fecha);
            //también se podría utilizar el constructor por defecto para crear el 
            //objeto Persona y después asignar los valores de los atributos
            //mediante los métodos set.
            
            //se añade el objeto al array
            personas[i] = p;
        }
    }

    //Mostrar todas las personas
    public static void mostrarPersonas() {
        for (int i = 0; i < personas.length; i++) {
            System.out.println(personas[i]);
        }
    }

    //Método que devuelve la persona de mayor edad
    //En este método se utiliza el método esMenorQue() de la clase Fecha
    public static Persona personaDeMayorEdad() {
        Persona mayor = personas[0];
        for (int i = 1; i < personas.length; i++) {
            if (personas[i].getFechaNacimiento().esMenorQue(mayor.getFechaNacimiento())) {                        
                mayor = personas[i];
            }
        }
        return mayor;
    }

    //Calcula y devuelve el número de personas que viven
    //en la ciudad que se recibe como parámetro
    public static int cuantasPersonasVivenEn(String ciudad) {
        int contador = 0;
        for (int i = 0; i < personas.length; i++) {
            if (personas[i].getPoblacion().equalsIgnoreCase(ciudad)) {
                contador++;
            }
        }
        return contador;
    }

    //Calcula y devuelve el número de personas mayores de edad
    //En este método se utiliza el método esMayorDeEdad() de la clase Persona
    public static int personasMayoresDeEdad() {
        int contador = 0;
        for (int i = 0; i < personas.length; i++) {
            if (personas[i].esMayorDeEdad()) {
                contador++;
            }
        }
        return contador;
    }
}


No hay comentarios:

Publicar un comentario