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

Compare To - Java III - Exercício 10

Bom dia,

Eu tenho minha classe ContaPoupancaque extends a classe Conta.

A classe Conta implementa o CompareTo:

@Override //ordena pelo número da conta
    public int compareTo(Conta outra) {
        if (this.numero < outra.numero) return -1;
        if (this.numero > outra.numero) return 1;
        return 0;
    }

E agora eu sobrescrevi o método na classe ContaPoupanca:

@Override
    public int compareTo(Conta outra) {
        return nomeDoCliente.compareTo(outra.nomeDoCliente);
    }

Acontece que quando eu vou ordenar contas do tipo ContaCorrente (que também extends Conta, mas não sobrescreve o método CompareTo) e do tipo ContaPoupanca:

package com.company.br.com.caelum.fj11.programa;

import com.company.br.com.caelum.fj11.modelo.Conta;
import com.company.br.com.caelum.fj11.modelo.ContaCorrente;
import com.company.br.com.caelum.fj11.modelo.ContaPoupanca;

import javax.swing.*;
import java.util.*;

public class TestaOrdenacao {

    public static void main(String[] args) {

        List<Conta> contas = new LinkedList<>(); //pode trocar por ArrayList = polimorfismo
        Random random = new Random();

        Conta c1 = new ContaPoupanca(1389, "João Barbosa"); //new ContaPoupanca(random.nextInt(2000), "João Barbosa");
        c1.deposita(500);//(random.nextInt(10000) + random.nextDouble());
        Conta c2 = new ContaCorrente(random.nextInt(2000), "Maria Severina");
        c2.deposita(random.nextInt(10000) + random.nextDouble());
        Conta c3 = new ContaPoupanca(400, "Rosa Santos"); //new ContaPoupanca(random.nextInt(2000), "Rosa Santos");
        c3.deposita(500);//(random.nextInt(10000) + random.nextDouble());

        contas.add(c1);
        contas.add(c2);
        contas.add(c3);

        Collections.sort(contas);

        for (Conta c : contas) { //Solução do Instrutor
            System.out.print(c.getNomeDoCliente() + " ");
            System.out.println(c); //coloquei só isso System.out.println(contas);
        }

    }
}

A saída é:

/Library/Java/JavaVirtualMachines/jdk-9.0.1.jdk/Contents/Home/bin/java "-javaagent:/Applications/IntelliJ IDEA CE.app/Contents/lib/idea_rt.jar=49287:/Applications/IntelliJ IDEA CE.app/Contents/bin" -Dfile.encoding=UTF-8 -classpath /Users/brunasantos/IdeaProjects/BancoAntigo/out/production/BancoAntigo com.company.br.com.caelum.fj11.programa.TestaOrdenacao
João Barbosa Conta número 1389, com saldo R$ 499.9
Maria Severina Conta número 1393, com saldo R$ 6136.997724786507
Rosa Santos Conta número 400, com saldo R$ 499.9

Process finished with exit code 0

Se a conta da Maria é do tipo ContaCorrente, é ordenada através do número, então ela não deveria vir depois da conta da Rosa? E aí as contas do tipo ContaPoupancaordenadas pelo nome do cliente? A saída que eu esperava era essa:

João Barbosa Conta número 1389, com saldo R$ 499.9
Rosa Santos Conta número 400, com saldo R$ 499.9
Maria Severina Conta número 1393, com saldo R$ 6136.997724786507

Por que não fica assim?

Obrigada!

2 respostas

Porque durante a ordenação ele está chamando o método comparteTo da ContaPoupanca também. Quando você ele vai comparar uma ContaPoupanca com uma ContaCorrente, o método que vai ser chamado, nesse caso, é o compareTo da ContaPoupanca. Então na sequência das invocações ta acabando com essa ordenação.

solução!

Alberto,

Obrigada pela resposta. Eu entendia sua resposta, mas aí rodei o código novamente e já deu uma nova saída:

/Library/Java/JavaVirtualMachines/jdk-9.0.1.jdk/Contents/Home/bin/java "-javaagent:/Applications/IntelliJ IDEA CE.app/Contents/lib/idea_rt.jar=50911:/Applications/IntelliJ IDEA CE.app/Contents/bin" -Dfile.encoding=UTF-8 -classpath /Users/brunasantos/IdeaProjects/BancoAntigo/out/production/BancoAntigo com.company.br.com.caelum.fj11.programa.TestaOrdenacao
Maria Severina Conta número 410, com saldo R$ 3587.233730057403
João Barbosa Conta número 1389, com saldo R$ 499.9
Rosa Santos Conta número 400, com saldo R$ 499.9

Process finished with exit code 0

Então eu entendi que na verdade nem sempre o resultado vai ser pelo CompareTo da ContaPoupanca. Quem dita a regra é a conta que ocupará o parâmetro do método CompareTo.

Na primeira saída, a conta da Maria ditou a regra, comparou por numero, em seguida, a conta da Rosa dita a regra e compara pela String.

Na saída acima, acontece a mesma coisa e por isso Maria passa a vir primeiro.

Fiz essa "mistura" para ver como o código se comportava, mas por fim consegui entender.

Abraço!