Como ordenar um Array por um valor em ordem decrescente

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]";
    }

}

Pode usar o Comparator ou Comparable.

Exemplo: