Ir ao conteúdo

Java Quero fazer ordenação de data/hora, usando compareTo mas não pega


Ir à solução Resolvido por Flávio Pedroza,

Posts recomendados

Postado

Estou tentando fazer a ordenação de uma lista de datas em Java, mas não tô conseguindo faze com que ela fica ordenada de forma correta.  Na classe Hora a ordenação ta funcionando perfeitamente, mas quando vou ordenar a classe Data e tem hora também não pega.

Código da classe Hora

package comparetotest;

public class Hora implements Comparable<Hora> {

    private int hora; // 0 -23
    private int minutos; // 0 - 59

    public Hora(int hora, int minutos) {
        this.hora = ((hora >= 0 && hora < 24) ? hora : 0); //validando a hora
        this.minutos = ((minutos >= 0 && minutos < 60) ? minutos : 0); // validando os minutos
    }

    public int getHora() {
        return hora;
    }

    public void setHora(int hora) {
        this.hora = hora;
    }

    public int getMinutos() {
        return minutos;
    }

    public void setMinutos(int minutos) {
        this.minutos = minutos;
    }

    @Override
    public String toString() {
        return String.format("%d:%02d", hora, minutos);
    }

    @Override
    public int compareTo(Hora h) {
        if (this.getHora() > h.getHora()) {
            return 1;
        }
        if(this.getMinutos() > h.getMinutos()){
            return 1;
        }
        if (this.getHora() < h.getHora()) {
            return -1;
        }
        if(this.getMinutos() < h.getMinutos()){
            return -1;
        }
        return 0;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + hora;
        result = prime * result + minutos;
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        Hora other = (Hora) obj;
        if (hora != other.hora) {
            return false;
        }
        if (minutos != other.minutos) {
            return false;
        }
        return true;
    }
}

Código da classe Data

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package comparetotest;

/**
 *
 * @author Windows
 */
public class Data implements Comparable<Data> {

    private int dia; // 1 - 31
    private int mes; // 1 - 12
    private int ano;
    private Hora hora;

    public Data(int dia, int mes, int ano, Hora hora) {
        this.dia = ((dia >= 1 && dia <= 31) ? dia : 1); //validando o dia
        this.mes = ((mes >= 1 && mes <= 12) ? mes : 1); // validando o mes
        this.ano = ano;
        this.hora = hora;
    }

    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 getAno() {
        return ano;
    }

    public void setAno(int ano) {
        this.ano = ano;
    }

    public Hora getHora() {
        return hora;
    }

    public void setHora(Hora hora) {
        this.hora = hora;
    }

    @Override
    public String toString() {
        return "Data/Hora: " + dia + "/" + mes + "/" + ano + " " + hora.toString();
    }

    @Override
    public int compareTo(Data d) {
        if(this.getMes() > d.getMes()){
            return 1;
        }
        if(this.getMes() < d.getMes()){
            return -1;
        }
        if(this.getDia() > d.getDia()){
            return 1;
        }
        if(this.getDia() < d.getDia()){
            return -1;
        }
        if(this.getAno() > d.getAno()){
            return 1;
        }
        if(this.getAno() < d.getAno()){
            return -1;
        }
        if(this.getHora().getHora() > d.getHora().getHora()){
            return 1;
        }
        if(this.getHora().getHora() < d.getHora().getHora()){
            return -1;
        }
        return 0;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ano;
        result = prime * result + dia;
        result = prime * result + ((hora == null) ? 0 : hora.hashCode());
        result = prime * result + mes;
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        Data other = (Data) obj;
        if (ano != other.ano) {
            return false;
        }
        if (dia != other.dia) {
            return false;
        }
        if (hora == null) {
            if (other.hora != null) {
                return false;
            }
        } else if (!hora.equals(other.hora)) {
            return false;
        }
        if (mes != other.mes) {
            return false;
        }
        return true;
    }

}

Código que testa a ordenação 


package comparetotest;

import java.util.ArrayList;
import java.util.Collections;

public class CompareTotest {

    public static void main(String[] args) {
        // TODO code application logic here
        ArrayList<Hora> horas = new ArrayList<>();
        ArrayList<Data> datas = new ArrayList<>();
        
        Hora hora1 = new Hora(1,50);
        Hora hora2 = new Hora(1,40);
        Hora hora7 = new Hora(1,00);
        Hora hora3 = new Hora(1,30);
        Hora hora4 = new Hora(1,20);
        Hora hora5 = new Hora(1,10);
        Hora hora6 = new Hora(1,00);
        
        
        horas.add(hora1);
        horas.add(hora2);
        horas.add(hora3);
        horas.add(hora4);
        horas.add(hora5);
        horas.add(hora6);
        horas.add(hora7);
        
        Collections.sort(horas);
        
        for(Hora hora: horas){
            System.out.println(hora);
        }
        
        Data data1 = new Data(13,12,2017,hora1);
        Data data2 = new Data(17,11,2016,hora2);
        Data data3 = new Data(12,10,2019,hora3);
        Data data4 = new Data(11,10,2016,hora4);
        Data data5 = new Data(10,8,2015,hora5);
        Data data6 = new Data(12,10,2016,hora6);
        Data data7 = new Data(11,6,2018,hora7);
        
        
        datas.add(data1);
        datas.add(data2);
        datas.add(data3);
        datas.add(data4);
        datas.add(data5);
        datas.add(data6);
        datas.add(data7);
        
        Collections.sort(datas);
        
        for(Data data: datas){
            System.out.println(data);
        }

        
    }
    
}

A saída é a seguinte :

run:
1:00
1:00
1:10
1:20
1:30
1:40
1:50
Data/Hora: 11/6/2018 1:00
Data/Hora: 10/8/2015 1:10
Data/Hora: 11/10/2016 1:20
Data/Hora: 12/10/2016 1:00
Data/Hora: 12/10/2019 1:30
Data/Hora: 17/11/2016 1:40
Data/Hora: 13/12/2017 1:50
CONSTRUÍDO COM SUCESSO (tempo total: 2 segundos)

A ordenação de Horas tá funcionando. Mas a de Data só da ordenando pelo mês e eu quero ele ele ordene pelo ano, mês e dia, se possível caso tenha data iguais, a ordenação seja feita pela horas.  

  • Curtir 1
  • Solução
Postado

Para ordenar/comparar datas, você tem que comparar primeiro o ano, depois o mês e por fim o dia.

Veja se assim funcionar, não tive como testar eu mesmo:

public int compareTo(Data d) {
 		if(this.getAno() > d.getAno()){
            return 1;
        }
         if(this.getAno() < d.getAno()){
            return -1;
        }
        if(this.getMes() > d.getMes()){
            return 1;
        }
        if(this.getMes() < d.getMes()){
            return -1;
        }
        if(this.getDia() > d.getDia()){
            return 1;
        }
        if(this.getDia() < d.getDia()){
            return -1;
        }
       
       if(this.getHora().getHora() > d.getHora().getHora()){
            return 1;
        }
        if(this.getHora().getHora() < d.getHora().getHora()){
            return -1;
        }
        return 0;
    }

 

  • Curtir 1
  • Amei 1

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!