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