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

Erro na ordenação pelo atributo nome

Minha lista de contas continua exibindo o saldo. Por quê?

package br.com.empresa.banco;

import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.Random;

import br.com.empresa.banco.conta.ContaCorrente;

public class TestaOrdenacao {
    public static void main(String[] args) {
        Random random = new Random();

        ContaCorrente c1 = new ContaCorrente();
        c1.setSaldo(500);
        c1.setNumero(1);
        c1.setNome("Pedro");

        ContaCorrente c2 = new ContaCorrente();
        c2.setSaldo(300);
        c2.setNumero(2);
        c2.setNome("Maria");

        ContaCorrente c3 = new ContaCorrente();
        c3.setSaldo(200);
        c3.setNumero(3);
        c3.setNome("Andre");

        ContaCorrente c4 = new ContaCorrente();
        c4.setSaldo(100);
        c4.setNumero(4);
        c4.setNome("Gustavo");

        ContaCorrente c5 = new ContaCorrente();
        c5.setSaldo(400);
        c5.setNumero(5);
        c5.setNome("Ricardo");

        ContaCorrente c6 = new ContaCorrente("Caio");
        c6.deposita(random.nextInt(10000) + random.nextDouble());

        ContaCorrente c7 = new ContaCorrente("Bruno");
        c7.deposita(random.nextInt(10000) + random.nextDouble());

        ContaCorrente c8 = new ContaCorrente("Fernando");
        c8.deposita(random.nextInt(10000) + random.nextDouble());


        List<ContaCorrente> listaContas = new ArrayList<>();
        listaContas.add(c1);
        listaContas.add(c2);
        listaContas.add(c3);
        listaContas.add(c4);
        listaContas.add(c5);
        listaContas.add(c6);
        listaContas.add(c7);
        listaContas.add(c8);

        System.out.println(listaContas);

        Collections.sort(listaContas);

        //System.out.println(listaContas);

        for(ContaCorrente conta : listaContas) {
            System.out.println(conta);
        }
    }

}

Saída:

[Uma conta com valor: 500.0, Uma conta com valor: 300.0, Uma conta com valor: 200.0, Uma conta com valor: 100.0, Uma conta com valor: 400.0, Uma conta com valor: 4928.651169686182, Uma conta com valor: 1338.9028141634938, Uma conta com valor: 100.32207699105003]
Uma conta com valor: 200.0
Uma conta com valor: 1338.9028141634938
Uma conta com valor: 4928.651169686182
Uma conta com valor: 100.32207699105003
Uma conta com valor: 100.0
Uma conta com valor: 300.0
Uma conta com valor: 500.0
Uma conta com valor: 400.0
2 respostas
solução!

Fala Geovane, tudo bem ?

A sua ordenação pelo atributo nome está sendo aplicada corretamente. O problema aqui na verdade é outro. Quando imprimimos um tipo referência através do println - System.out.println(conta) no forEach - o que acontece é que, por baixo dos panos, o Java chama o método toString do objeto. Seu toString da conta deve estar com a seguinte implementação return "Uma conta com valor: "+ this.saldo;

Se você mudar esse toString incluindo o nome na saída, ou até chamar conta.getSaldo() no forEach já deve resolver.

Mas a ordenação creio que esteja certa. Veja que a primeira conta exibida na lista ([Uma conta com valor: 500.0,...) tem valor 500, e a primeira exibida depois da ordenação no forEach, já tem valor 200 (que é do cliente de nome "André") =).

Espero ter ajudado. Abraço!

Valeu Rafael.

Pra não ter que mudar muita coisa apenas chamei o getNome() no for.

for(ContaCorrente conta : listaContas) {
    System.out.println(conta.getNome());
}