Ir ao conteúdo
  • Cadastre-se

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


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

Posts recomendados

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
Link para o post
Compartilhar em outros sites
  • Solução

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
Link para o post
Compartilhar em outros sites

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...

Redes-Wi-Fi-capa-3d-newsletter.png

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!