Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

método sort não ordena ao colocar como LinkedList

Fiz a atividade onde pede para alterar uma ArrayList para LinkedList e o método sort para de ordenar.

package br.com.felipe.banco.sistema;

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

import br.com.felipe.banco.conta.Conta;
import br.com.felipe.banco.conta.ContaPoupanca;
import br.com.felipe.banco.conta.ValorInvalidoException;

public class TestaOrdenacao {
    public static void main(String[] args) throws ValorInvalidoException {
        // TODO Auto-generated method stub
        Conta c1 = new ContaPoupanca(1);
        c1.deposita(300);
        Conta c2 = new ContaPoupanca(2);
        c2.deposita(100);
        Conta c3 = new ContaPoupanca(3);
        c3.deposita(500);
        Conta c4 = new ContaPoupanca(4);
        c4.deposita(50);

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

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

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

}
package br.com.felipe.banco.conta;

/*
 * Classe responsável por moldar as contas do Banco
 * 
 * @author Felipe Macedo
 * 
 * 
 */

public abstract class Conta {

    protected double saldo;
    protected int numero;
    private String titular;

    Conta(int numero){
        this.numero = numero;
    }

    public String getTitular() {
        return titular;
    }

    public void setTitular(String titular) {
        this.titular = titular;
    }

    public int getNumero() {
        return numero;
    }

    public void setNumero(int numero) {
        this.numero = numero;
    }

    public double getSaldo() {
        return this.saldo;
    }

    public void deposita(double valor) throws ValorInvalidoException {

            if (valor < 0) {
                    throw new ValorInvalidoException(valor);
                } else{
                    this.saldo += valor;
                }

    }

    public String toString(){

        return "Conta número: "+this.numero+"\n";
    }

    public void saca(double valor) {
        this.saldo -= valor;
    }

    public abstract void atualiza(double taxa);

    @Override
    public boolean equals(Object obj) {
        // TODO Auto-generated method stub
        Conta outraConta = (Conta) obj;
        return this.numero == outraConta.numero &&
                this.titular.equals(outraConta.titular);
    }

    public int compareTo(ContaPoupanca outra) {
        // TODO Auto-generated method stub
        return 0;
    }

}
package br.com.felipe.banco.conta;

public class ContaPoupanca extends Conta implements Comparable{

    public ContaPoupanca(int numero) {
        super(numero);
        // TODO Auto-generated constructor stub
    }

    @Override
    public void atualiza(double taxa) {
        // TODO Auto-generated method stub
            this.saldo += super.saldo;

    }

    @Override
    public int compareTo(ContaPoupanca outra) {
        // TODO Auto-generated method stub
        if(this.numero < outra.numero){
            return -1;
        }
        if(this.numero > outra.numero){
            return 1;
        }
        return 0;
    }

    @Override
    public int compareTo(Object arg0) {
        // TODO Auto-generated method stub
        return 0;
    }



}
1 resposta
solução!

Olá Felipe,

Quanto a esta questão da ordenação, o ideal é a implementação do Comparable ficar na Conta, pois assim qualquer filha de Conta já herdará a forma de como se comparar a outra Conta. Ficando algo assim:

public abstract class Conta implements Comparable<Conta> {

É importante definir junto da interface implementada, o tipo de objeto que é usado na comparação, nessa caso, uma Conta, é comparável a outra Conta.

Com isso, nas subclasses de Conta, como ContaCorrente e ContaPoupanca, você implementa o compare da forma necessária. Assim cada subclasse herdou a necessidade de implementar como se comparar, dentro de cada compare você pode pegar a referência de Conta que vem por parâmetro e fazer cast para o tipo correto, já que em geral você não vai tentar comparar uma ContaCorrente com uma ContaPoupanca, elas serão compradas apenas entre objetos de seu próprio tipo. Também seria possível implementar Comparable em cada subclasse separadamente, ai ficaria algo como:

public class ContaPoupanca extends Conta implements Comparable<ContaPoupanca> { 
...

public class ContaCorrente extends Conta implements Comparable<ContaCorrente> { 
...

Ajustando isso, eu rodei seu exemplo e funcionou normalmente, tanto com ArrayList como LinkedList.

Abraço.