Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Collections.sort "Não Ordena"

Olá Galera, estou colocando em prática o que venho aprendendo nas aulas anteriores, nesta aula o professor faz uma ordenação usando a classe "Collections.sort", o método da classe Funcionario foi implementado corretamente no entanto não está ocorrendo essa ordenação conforme o método implementado.

public static void main(String[] args) throws IOException, ClassNotFoundException {

        List<Funcionario> listafuncionarios = new ArrayList<Funcionario>();

        listafuncionarios.add(new Funcionario("Wellington", 35, "123456-0", 1800.00));
        listafuncionarios.add(new Funcionario("Girdacio", 28, "147258-6", 3500.00));
        listafuncionarios.add(new Funcionario("Bill", 45, "147258-6", 5500.00));


        ObjectOutputStream gerarArquivoFuncionario = new ObjectOutputStream(new FileOutputStream("arquivoFuncionario.bin"));
        gerarArquivoFuncionario.writeObject(listafuncionarios);
        gerarArquivoFuncionario.close();

        ObjectInputStream conversaoArquivoFuncionario = new ObjectInputStream(new FileInputStream("arquivoFuncionario.bin"));
        List<Funcionario> funcionarioList = (List<Funcionario>) conversaoArquivoFuncionario.readObject();
        conversaoArquivoFuncionario.close();

        Collections.sort(listafuncionarios);


        funcionarioList.forEach(funcionario -> {
            System.out.println("" + funcionario);
        });

    }

Segue o método implementado na classe Funcionário

 @Override
    public int compareTo(Funcionario outro) {
        return (this.idade - outro.idade);
    }
4 respostas

Olá Wellington!

Tenta colocar

 @Override
    public int compareTo(Funcionario outro) {
        return this.idade.compareTo (outro.idade);
    }

Neste caso o método que está subescrevendo irá chamar o método compareTo() original passando os valores que deseja comparar, no caso a idade.

Fala Emerson blz, cara fiz essa alteração no método mas não fez a ordenação.

solução!

Fiz algumas alterações em seu código.

1 - Adicionaei "implements Serializable, Comparable "na classe Funcionário.

2 - Então reescrevi o método toString, para melhor visualização dos resultados, e o método compareTo, para ordenação por idade , conforme a primeira forma que vc havia postado aqui.

A classe Funcionários ficou assim.

public class Funcionario implements Serializable, Comparable<Funcionario> {

    private static final long serialVersionUID = 1L;
    private String nome;
    private int idade;
    private String cpf;
    private double valor;

    public Funcionario(String nome, int idade, String cpf, double valor) {
        this.nome = nome;
        this.idade = idade;
        this.cpf = cpf;
        this.valor = valor;
    }

    @Override
    public String toString() {
        return "[" + nome + ", " + idade + ", " + cpf + ", " + valor + "]";
    }

    @Override
    public int compareTo(Funcionario outro) {
        return (this.idade - outro.idade);
    }
} 

A classe de teste ficou assim.

package br.com.alura;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class TesteOrdenacaoForum {

    public static void main(String[] args) throws IOException, ClassNotFoundException {

        List<Funcionario> listafuncionarios = new ArrayList<Funcionario>();

        listafuncionarios.add(new Funcionario("Wellington", 35, "123456-0", 1800.00));
        listafuncionarios.add(new Funcionario("Girdacio", 28, "147258-6", 3500.00));
        listafuncionarios.add(new Funcionario("Bill", 45, "147258-6", 5500.00));

        ObjectOutputStream gerarArquivoFuncionario = new ObjectOutputStream(new FileOutputStream("arquivoFuncionario.bin"));
        gerarArquivoFuncionario.writeObject(listafuncionarios);
        gerarArquivoFuncionario.close();

        ObjectInputStream conversaoArquivoFuncionario = new ObjectInputStream(
                new FileInputStream("arquivoFuncionario.bin"));
        List<Funcionario> funcionarioList = (List<Funcionario>) conversaoArquivoFuncionario.readObject();
        conversaoArquivoFuncionario.close();

        System.out.println(funcionarioList);
        Collections.sort(funcionarioList);
        System.out.println(funcionarioList);
    }
}

A saída do consele ficou assim:

[[Wellington, 35, 123456-0, 1800.0], [Girdacio, 28, 147258-6, 3500.0], [Bill, 45, 147258-6, 5500.0]]

[[Girdacio, 28, 147258-6, 3500.0], [Wellington, 35, 123456-0, 1800.0], [Bill, 45, 147258-6, 5500.0]]

Observe se sua classe Funcionário está com as implementações corretas "Serializable, Comparable".

Se não funcionar, coloca aqui o código completo das classes por favor.

Fala Emerson cara obrigado comparando agora com seu código o erro no meu na verdade foi na hora de passar a variável dentro do Colletions.sort.

no meu código ficou assim

Collections.sort(listafuncionarios);

e no seu ficou assim:

Collections.sort(funcionarioList);

resumindo foi total falta de atenção na hora de passar o parâmetro dentro da Collections.sort, muito obrigado pela ajuda.