4
respostas

Collections.sort(contas) não está ordenando por numero da conta...

Não está ordenando por numero da conta, quando solicitei a ordenação pelo saldo ele funciona. O que está errado?

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

public class TestaOrdenacao {

    public static void main(String[] args) {

        List<ContaPoupanca> contas = new ArrayList<ContaPoupanca>();

        ContaPoupanca c1 = new ContaPoupanca(400, "Caio");
        c1.deposita(1500);
        contas.add(c1);

        ContaPoupanca c2 = new ContaPoupanca(467, "Adriano");
        c2.deposita(2050);
        contas.add(c2);

        ContaPoupanca c3 = new ContaPoupanca(230, "Victor");
        c3.deposita(1070);
        contas.add(c3);

        Collections.sort(contas);

        for (ContaPoupanca conta : contas) {

            System.out.println(conta);
            // System.out.println(conta.getSaldo());
        }

    }

}

// Aqui a classe ContaPoupanca:

public class ContaPoupanca extends Conta implements Comparable<ContaPoupanca> {

    private double saldo;
    private int numero;

    ContaPoupanca(int numero, String nome) {

        this.numero = numero;
        this.nome = nome;
    }

    public double getSaldo() {

        return this.saldo;

    }

    public int getNumero() {

        return this.numero;
    }

    public void atualiza(double taxaSelic) {

        this.saldo = this.saldo * taxaSelic;

    }

    @Override
    void saca(double valor) {

        this.saldo -= valor;

    }

    @Override
    void deposita(double valor) {
        this.saldo += valor;

    }

    @Override
    public int compareTo(ContaPoupanca outra) {
        // TODO Auto-generated method stub
        return this.getNumero() - outra.getNumero();
    }

}
4 respostas

Olá José,

A Classe ContaPoupanca parece certinha. No seu laço você está exibindo:

 System.out.println(conta);

Como ContaPoupanca não tem toString() sobrescrito vai mostrar aquele famoso ContaPoupanca@2a468g6. Se você colocar para exibir conta.getNumero() realmente não está ordenando?

Abraço.

Não entendi a minha saída no console Segue a classe ContaPoupanca.

package br.com.caelum.fj11.modelo;

public class ContaPoupanca extends Conta implements Comparable<ContaPoupanca>{

    public ContaPoupanca() {
    }

    public ContaPoupanca(String nome, int numero) {
        this.nome = nome;
        this.numero = numero;
    }
    public ContaPoupanca(double saldo) {
        this.saldo = saldo;
    }

    public void setNome(String nome) {
        this.nome =  nome;        
    }

    @Override
    public double atualiza(double taxa) {
        return this.saldo = (this.saldo * taxa);
    }

    @Override
    public boolean equals(Object object) {
        if (!(object instanceof ContaPoupanca))
            return false;
        ContaPoupanca poupanca = (ContaPoupanca) object;
        return this.saldo == poupanca.saldo && this.nome.equals(poupanca.nome);

    }

    @Override
    public int compareTo(ContaPoupanca poupanca) {
        return this.getNumero() - poupanca.numero;
    }
}

Segue a classe de teste TestaOrdencao.

package br.com.caelum.fj11.programa;

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

import br.com.caelum.fj11.modelo.ContaPoupanca;

public class TestaOrdenacao {

    public static void main(String[] args) {
        List<ContaPoupanca> contas = new ArrayList<>();

        ContaPoupanca cp1 = new ContaPoupanca("Edu", 456);
        cp1.deposita(100);

        ContaPoupanca cp2 = new ContaPoupanca("Max", 123);
        cp2.deposita(200);

        ContaPoupanca cp3 = new ContaPoupanca("Alves", 789);
        cp3.deposita(200);

        contas.add(cp1);
        contas.add(cp2);
        contas.add(cp3);

        System.out.println(cp1.compareTo(cp2));
        Collections.sort(contas);

        for (ContaPoupanca conta : contas) {
            System.out.println(conta +" "+ conta.getNome());
        }
    }
}

E a minha saída no console.

333
Conta com saldo: 200.0 Max
Conta com saldo: 100.0 Edu
Conta com saldo: 200.0 Alves

Entendi. Está ordenando pelo número da conta.

Sim, o critério de ordenação do compareTo implementado é pelo número da conta de forma crescente.

 @Override
    public int compareTo(ContaPoupanca poupanca) {
        return this.getNumero() - poupanca.numero;
    }