Tenho um ArrayList onde os atributos do objeto são: Nome, data de nascimento , cpf, sexo e idade. Tenho uma Tela onde cadastrando pessoas nessa lista e as imprimo, até o momento criei métodos para inserir, buscar castrado desejado, remover e listar todos os cadastros realizados sendo cada castrado armazenado em um índice do array e neles os atributos ,gostaria de exibir esse objeto ordenados pela idade em ordem decrescente, e juntamente com isso criar um método para adicionar doses de vacinas e partir da idade das pessoas cadastradas ir diminuindo, lembrando que o requisito de vacinação é a idade maior. Como posso fazer isso?
Segue os códigos:
Classe principal
package LP02;
import java.util.Scanner;
import java.time.LocalDate;
import java.time.Period;
import java.util.Arrays;
import java.util.Collections;
public class HashUtil {
private static Hash registro = new Hash();
private static Scanner scanner = new Scanner(System.in);
public static void main(String[] args) {
int op;
do {
System.out.println();
System.out.println("* CADASTRO DE PESSOAS *");
System.out.println("* 1 -> INSERIR *");
System.out.println("* 2 -> BUSCAR *");
System.out.println("* 3 -> REMOVER *");
System.out.println("* 4 -> LISTAR TODOS *");
System.out.println("* 5 -> ADICIONAR DOSES *");
System.out.println("* 6 -> ADICIONAR DOSES POR PRIORITÁRIOS *");
System.out.println("* 7 -> ENCERRAR *");
System.out.println("*****************************************");
System.out.print("\nInforme Operação (1-7): ");
op = scanner.nextInt();
switch (op) {
case 1:
adicionarCadastro();
break;
case 2:
buscarCadastro();
break;
case 3:
removerCadastro();
break;
case 4:
listarCadastro();
break;
case 5:
adicionarDoses();
break;
case 6:
adicionarDosesPrioridade();
}
} while (op != 7);
}
/* entrada de dados do cadastro para inserção de cadastro novo */
public static Cadastro lerCadastro(Cadastro cadastroAntigo) {
String temp;
String nome;
String data;
Sexo sexo;
long cpf = 0;
int dia = 0, mes = 0, ano = 0;
int idade = 0;
//int doses;
scanner.nextLine();
// entrada de nome para o cadastro.
if (cadastroAntigo != null) {
nome = cadastroAntigo.getNome();
System.out.println("Nome Anterior: " + cadastroAntigo.getNome());
} else {
System.out.print("Nome........................: ");
nome = scanner.nextLine();
}
// entrada de data para o cadastro.
if (cadastroAntigo != null) {
System.out.println("Dia de Nascimento Anterior: " + cadastroAntigo.getDia());
System.out.println("Mes de Nascimento Anterior: " + cadastroAntigo.getMes());
System.out.println("Ano de Nascimento Anterior: " + cadastroAntigo.getAno());
} else {
System.out.print("Dia do Nascimento......................: ");
dia = scanner.nextInt();
System.out.print("Mês do Nascimento......................: ");
mes = scanner.nextInt();
System.out.print("Ano do Nascimento......................: ");
ano = scanner.nextInt();
LocalDate data1 = LocalDate.of(ano, mes, dia);
LocalDate data3 = LocalDate.of(2021, 01, 01);
Period periodo = Period.between(data1, data3);
int dias = periodo.getDays();
int meses = periodo.getMonths();
idade = periodo.getYears();
}
// entrada de cpf para cadastro.
if (cadastroAntigo != null) {
cpf = cadastroAntigo.getCpf();
} else {
System.out.print("CPF (): ");
cpf = scanner.nextLong();
}
if (cadastroAntigo != null) {
System.out.println("Sexo Anterior: " + cadastroAntigo.getCategoria());
}
// entrada do sexo para cadastro.
do {
System.out.println("Sexo Disponíveis (Masculino,Feminino, Outros): ");
System.out.print("Sexo: (M/F/O).: ");
temp = scanner.next().toUpperCase().trim();
sexo = temp.equals("M") ? Sexo.MASCULINO
: temp.equals("F") ? Sexo.FEMININO
: temp.equals("O") ? Sexo.OUTROS
: null;
if (sexo == null) {
System.out.println("ENTRADA DE SEXO INVÁLIDA!");
}
} while (sexo == null);
// instanciação de cadastro com base em dados fornecidos.
return new Cadastro(nome, cpf, dia, mes, ano, sexo, idade);
}
public static void adicionarCadastro() {
// entrada de dados do novo cadastro
System.out.println("\nDADOS DO NOVO CADASTRO");
Cadastro novoCadastro = lerCadastro(null);
// inserção de pessoa cadastro na lista.
if (registro.adicionarCadastro(novoCadastro)) {
System.out.println("\nCADASTRADO COM SUCESSO!");
} else {
System.out.println("\nCPF INVÁLIDO OU JÁ CADASTRADO!");
}
}
public static void removerCadastro() {
long cpf;
// entrada de cpf de cadastro a ser removido
System.out.print("\nCPF do Cadastro a ser Removido: ");
cpf = scanner.nextLong();
// localização de cadastro a ser removido
Cadastro cadastro = registro.getCadastroPorCpf(cpf);
// em caso de inexistência de cadastro com o cpf informado
if (cadastro == null) {
System.out.println("\nNENHUM CADASTRO COM O CPF INFORMADO!");
} else {
// remoção do cadastro da lista
registro.removerCadastro(cpf);
System.out.println("\nCADASTRO REMOVIDO COM SUCESSO!");
}
}
public static void listarCadastro() {
Cadastro[] contatos = registro.getCadastro();
System.out.println("\nLISTAGEM");
for (int i = 0; i < contatos.length; i++) {
System.out.println("Pessoa " + (i + 1) + ": " + contatos[i]);
}
}
public static void buscarCadastro() {
int idade;
// entrada de idade do cadastro a ser buscado.
System.out.print("\nIdade a Buscar : ");
idade = scanner.nextInt();
System.out.println("\nLISTAGEM POR IDADE");
// localização de cadastro a ser buscado
Cadastro[] cadastro = registro.getCadastro();
for (int i = 0; i < cadastro.length; i++) {
if (cadastro[i].getIdade() == idade) {
System.out.println("Pessoa " + (i + 1) + ": " + cadastro[i]);
} else {
//em caso de inexistência de cadastro com o idade informado
System.out.println("\nNENHUM CADASTRO COM IDADE INFORMADO!");
}
}
}
private static void adicionarDoses() {
int doses, qntDoses, qnt;
//localização de cadastro a ser buscado
Cadastro[] cadastro = registro.getCadastro();
int contador = 0;
for (int i = 0; i < cadastro.length; i++) {
if (cadastro[i] != null) {
contador++;
}
}
//imprimir quantidade pessoas cadastradas
System.out.println("Quantidade de pessoas cadastradas: " + cadastro.length);
//pergunta a quantidade de doses fornecidas
System.out.print("\nQuantidade de doses: ");
doses = scanner.nextInt();
qntDoses = doses / 2;
//imprimir quantidade de duas doses fornecidas
System.out.println("Quantidade de duas doses: " + qntDoses);
if (qntDoses >= cadastro.length) {
System.out.println("\nTODAS AS " + cadastro.length + " PESSOAS VACINADAS!");
qntDoses = qntDoses - cadastro.length;
System.out.println("\nRestaram " + qntDoses + " doses!");
} else {
qnt = cadastro.length - qntDoses;
System.out.println("\nQuantidade de pessoas imunizadas: " + qntDoses);
System.out.println("\nFALTARA " + qnt + " DOSES!");
}
}
private static void adicionarDosesPrioridade() {
int idade, doses, iVacinados = 0, aVacinados = 0, jVacinado = 0, qntDoses, restanteDoses = 0;
int contadorJovem = 0;
int contadorAdulto = 0;
int contadorIdoso = 0;
//pergunta a quantidade de doses fornecidas
System.out.print("\nQuantidade de doses: ");
doses = scanner.nextInt();
qntDoses = doses / 2;
//imprimir quantidade de duas doses fornecidas
System.out.println("\nQuantidade de pessoas imunizadas: " + qntDoses);
//localização de cadastro a ser buscado
Cadastro[] cadastro = registro.getCadastro();
Arrays.sort(cadastro, Collections.reverseOrder());
System.out.println("\nNúmeros ordenados: ");
for (Cadastro lerCadastro: cadastro) {
System.out.println(lerCadastro);
}
}
}
Classe Hash:
package LP02;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
public class Hash {
private Collection<Cadastro> lista;
public Hash() {
lista = new ArrayList<Cadastro>();
}
// inserção do cadastro
public boolean adicionarCadastro(Cadastro cadastro) {
Iterator<Cadastro> iterador = lista.iterator();
// retorno de booleano falso em caso do cadastro sem nome informado
if (cadastro.getCpf() == null || cadastro.getCpf().equals("")) {
return false;
}
// localização do cadastro já inserido com nome idêntico ao do novo contato
while (iterador.hasNext()) {
if (iterador.next().getCpf().equals(cadastro.getCpf())) {
return false; // retorno de booleano falso em caso do cadastro localizado (inserção não realizada)
}
}
// inserção de cópia do cadastro na lista
lista.add((Cadastro) cadastro.clone());
// retorno de booleano verdadeiro para indicar êxito na inserção do cadastro
return true;
}
// buscar o cadastro com base em respectiva cópia
public boolean buscarCadastro(Cadastro cadastro) {
Cadastro cadastroOriginal = null;
Cadastro cadastroTemp = null;
Iterator<Cadastro> iterador = lista.iterator();
// localização do cadastro já inserido cujo cpf é idêntico ao cpf do contato passado como parâmetro
while (iterador.hasNext() && cadastroOriginal == null) {
cadastroTemp = iterador.next();
if (cadastroTemp.getCpf().equals(cadastro.getCpf())) {
cadastroOriginal = cadastroTemp;
}
}
// retorno de booleano falso em caso de não localização do cadastro
if (cadastroTemp == null) {
return false;
}
// buscar dos dados do cadastro localizado (excetuando-se o cpf)
cadastroOriginal.setNome(cadastro.getNome());
cadastroOriginal.setCategoria(cadastro.getCategoria());
cadastroOriginal.setCpf(cadastro.getCpf());
cadastroOriginal.setIdade(cadastro.getIdade());
// retorno de booleano verdadeiro para indicar êxito na atualização do cadastro
return true;
}
// buscar o cadastro com base em respectiva cópia
public boolean adicionarDosesPrioridade(Cadastro cadastro) {
Cadastro cadastroOriginal = null;
Cadastro cadastroTemp = null;
Iterator<Cadastro> iterador = lista.iterator();
// localização do cadastro já inserido cujo cpf é idêntico ao nome do contato passado como parâmetro
while (iterador.hasNext() && cadastroOriginal == null) {
cadastroTemp = iterador.next();
if (cadastroTemp.getCpf().equals(cadastro.getCpf())) {
cadastroOriginal = cadastroTemp;
}
}
// retorno de booleano falso em caso de não localização do cadastro
if (cadastroTemp == null) {
return false;
}
// buscar dos dados do cadastro localizado (excetuando-se o cpf)
cadastroOriginal.setIdade(cadastro.getIdade());
// retorno de booleano verdadeiro para indicar êxito na atualização do cadastro
return true;
}
// remoção do cadastro a partir de seu índice na lista (indexação a partir de 1)
public Cadastro removerCadastro(int indice) {
Iterator<Cadastro> iterador = lista.iterator();
for (int i = 1; iterador.hasNext(); i++) {
// verificação de enésimo contato da lista (índice correspondente ou não ao índice do contato a ser removido)
if (i == indice) {
Cadastro cadastro = iterador.next();
iterador.remove(); // remoção do contato
return cadastro; // retorno do contato removido
}
}
// retorno de nenhuma referência do cadastro em caso de inexistência de contato em índice indicado
return null;
}
// remoção do cadastro a partir de seu cpf
public Cadastro removerCadastro(long cpf) {
Cadastro cadastro = null;
Iterator<Cadastro> iterador = lista.iterator();
while (iterador.hasNext()) {
cadastro = iterador.next(); // enésimo cadastro da lista
// verificação de enésimo contato da lista (nome correspondente ou não ao nome do contato a ser removido)
if (cadastro.getCpf().equals(cpf)) {
iterador.remove(); // remoção do cadastro
return cadastro; // retorno do cadastro removido
}
}
// retorno de nenhuma referência de cadastro em caso de inexistência de contato em índice indicado
return null;
}
// localização e retorno do cadastro por cpf
public Cadastro getCadastroPorCpf(long cpf) {
Cadastro cadastroTemp = null;
Iterator<Cadastro> iterador = lista.iterator();
// localização do cadastro cujo cpf é idêntico ao cpf do contato passado como parâmetro
while (iterador.hasNext()) {
cadastroTemp = iterador.next();
if (cadastroTemp.getCpf().equals(cpf)) {
return cadastroTemp; // retorno do cadastro localizado
}
}
// retorno de nenhuma referência do cadastro em caso de não localização
return null;
}
// localização e retorno do cadastro por cpf
public Cadastro getCadastroPorIndice(int indice) {
Iterator<Cadastro> iterador = lista.iterator();
// localização do cadastro a partir de índice passado como parâmetro
for (int i = 1; iterador.hasNext(); i++) {
if (i == indice) {
return iterador.next(); // retorno do cadastro localizado
}
}
// retorno de nenhuma referência do cadastro em caso de não localização
return null;
}
// retorno de todos os cadastro inseridos
public Cadastro[] getCadastro() {
Cadastro[] cadastro = lista.toArray(new Cadastro[lista.size()]);
for (int i = 0; i < cadastro.length; i++) {
cadastro[i] = (Cadastro) cadastro[i].clone();
}
return cadastro;
}
}
Classe sexo:
package LP02;
//class Sexo para retornar as categorias existentes
public enum Sexo {
// categoria MASCULINO
MASCULINO {
public String toString() {
return "MASCULINO";
}
},
// categoria FEMININO
FEMININO {
public String toString() {
return "FEMININO";
}
},
//categoria OUTROS para aqueles que não se identificam como MASCULINO e FEMININO
OUTROS {
public String toString() {
return "OUTROS";
}
},
}
Classe Cadastro:
package LP02;
public class Cadastro {
//Atibutos privados
private String nome;
private Long cpf;
private Sexo sexo;
private int idade=0;
private int dia = 0;
private int mes = 0;
private int ano = 0;
//Método construtor
public Cadastro(String nome, Long cpf, int dia, int mes, int ano ,Sexo categoria, int idade) {
this.nome = nome;
this.cpf = cpf;
this.dia = dia;
this.mes = mes;
this.ano = ano;
this.sexo = categoria;
this.idade = idade;
}
//Metodo get e set para nome (1)
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
//Metodo get e set para cpf(2)
public Long getCpf() {
return cpf;
}
public void setCpf(Long cpf) {
this.cpf = cpf;
}
//Metodo get e set para dia (3)
public int getDia() {
return dia;
}
public void setDia(int dia) {
this.dia = dia;
}
//Metodo get e set para mes(4)
public int getMes() {
return mes;
}
public void setMes(int mes) {
this.mes = mes;
}
//Metodo get e set para ano(5)
public int getAno() {
return ano;
}
public void setAno(int ano) {
this.ano = ano;
}
//Metodo get e set para sexo (6)
public Sexo getCategoria() {
return sexo;
}
public void setCategoria(Sexo sexo) {
this.sexo = sexo;
}
//Metodo get e set para idade(7)
public int getIdade() {
return idade;
}
public void setIdade(int idade) {
this.idade = idade;
}
//obejto clone para gerar uma cópia do atributos
public Object clone() {
return new Cadastro(nome, cpf, dia , mes , ano ,sexo, idade);
}
//metodo para imprimir.
public String toString() {
return "[Nome: " + nome + ", CPF: " + cpf + ", Data de Nascimento: " + dia + "/" + mes + "/" + ano + ", Sexo: " + sexo + ", Idade: " + idade + " anos]";
}
}