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

Collections FrameWork - video

package br.com.caelum.fj11.modelo;
import javax.management.RuntimeErrorException;

import br.com.caelum.fj11.excecao.ValorInvalidoException;

//public abstract class Conta {
public abstract class Conta implements  Comparable<Conta> {// este formato significa que Conta pode ser classificada
//  private double saldo;
    protected double saldo;
    private int numero;
    private String nome;

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

    public void setSaldo(double saldo) {
        this.saldo = saldo;
    }
    public String toString() {    
        return "esse objeto é uma conta com saldo R$" + this.saldo;
    }   


    public int getNumero() {
        return this.numero;
    }
    public int setNumero(int numero) {
        return this.numero;
    }

    public String getNome() {
        return this.nome;
    }
    public String setNome(String nome) {
        return this.nome;
    }


    /**
     * realiza um saque na conta dado o valor passado
     * @param valor_saque valor a ser sacado
     * @return
     * @throws Exception Excption caso saldo seja insuficiente
     */
    public boolean saca(double valor_saque) throws Exception {
        if (this.saldo < valor_saque) {
            //return false;
            throw new SaldoInsuficienteException(saldo);
        }
        else {
            this.saldo = this.saldo - valor_saque;
            return true;
        }
    }

// public void deposita(double valor_dep) {//use este formato quando a classe filha de RuntimeException
     public void deposita(double valor_dep) throws ValorInvalidoException  {//use este formato quando a classe filha de Exception       
//     if (valor_dep > 0) {// neste formato utiliza a exeption do java  
//      this.saldo += valor_dep;
//     }
//     else  {
//         throw new IllegalArgumentException("Você tentou depositar" + " um valor negativo");
//     }
       if (valor_dep > 0) {// neste formato utiliza a exeption pelo programador
          this.saldo += valor_dep;
         }
         else  {
             throw new ValorInvalidoException(valor_dep);
         }       
    }      

     /**
         * atualiza nome e numero de conta
         * 
         */
        public void idConta(int numero, String nome) {
            this.numero = numero;
            this.nome   = nome;

        }

        @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((nome == null) ? 0 : nome.hashCode());
        result = prime * result + numero;
        return result;
    }

        @Override
        public boolean equals(Object obj) {
            if (this == obj)
                return true;
            if (obj == null)
                return false;
            if (getClass() != obj.getClass())
                return false;
            Conta other = (Conta) obj;
            if (nome == null) {
                if (other.nome != null)
                    return false;
            } else if (!nome.equals(other.nome))
                return false;
            if (numero != other.numero)
                return false;
            return true;
        }



        public int compareTo(Conta outra) {
            if(this.saldo < outra.saldo) return -1;
            if(this.saldo > outra.saldo) return 1;
            return 0;
        }

   //public void atualiza(double taxa) {                                                                                                   
   //     this.saldo += (this.saldo * taxa);                                                                                                       
   // };       
    abstract public void atualiza(double taxa);

} 
----
package br.com.caelum.fj11.modelo;

public class ContaCorrente extends Conta implements Tributavel {

    public  ContaCorrente(int numero, String nome) {
        // TODO Auto-generated constructor stub
        return;
    }

    public void atualiza(double taxa) {
             this.saldo += this.saldo * taxa * 2;
      }

    @Override
    public double calculaTributos() {
        return this.getSaldo() * 0.01;
    }
}

----
package Testes;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;

import br.com.caelum.fj11.excecao.ValorInvalidoException;
import br.com.caelum.fj11.modelo.Conta;
import br.com.caelum.fj11.modelo.ContaCorrente;

public class TestaColecoes1 {
    public static void main(String[] args) {
        // utilizando a interface List com LinkedList
        //a interface list permite duplicidade de dado
        List<String> nomes = new LinkedList<String>(); 
        nomes.add("Mauricio");
        nomes.add("Guilherme");
        nomes.add("Guilherme");
        System.out.println(nomes.get(1));
        System.out.println(nomes.get(2));
        System.out.println(nomes.size());

        // Utilizando o metodo Set
        // este metodo não permite duplicidade de dados
        //evita duplicidade
        Set<String> nomes1 = new HashSet<String>(); 
        nomes1.add("Mauricio");
        nomes1.add("Guilherme");
        nomes1.add("Guilherme");

        System.out.println(nomes1.size());

        //utilizando o método set
        Set<Conta>    contas = new HashSet<Conta>();

        ContaCorrente c1 = new ContaCorrente(1, "Mauricio");
        try {
            c1.deposita(2000);
        } 
        catch (ValorInvalidoException e) {            
            System.out.println(e.getMessage()); //utilizando mensagem ca classe ValorInvalidoException
        }

        ContaCorrente c2 = new ContaCorrente(2, "Guilherme");
        try {
            c2.deposita(1000);
        } 
        catch (ValorInvalidoException e) {            
            System.out.println(e.getMessage()); //utilizando mensagem ca classe ValorInvalidoException
        }

        contas.add(c1);
        contas.add(c1);
        contas.add(c2);
        System.out.println("Quantidade de contas " + contas.size());
        // não entendi porque esta listado 1 onde devertia listar 2

        //utilizando classe Mapa
        Map<String, Conta>    contas1 = new HashMap<String, Conta>();

        ContaCorrente c3 = new ContaCorrente(1, "Mauricio");
        try {
            c1.deposita(2000);
        } 
        catch (ValorInvalidoException e) {            
            System.out.println(e.getMessage()); //utilizando mensagem ca classe ValorInvalidoException
        }

        ContaCorrente c4 = new ContaCorrente(2, "Guilherme");
        try {
            c2.deposita(1000);
        } 
        catch (ValorInvalidoException e) {            
            System.out.println(e.getMessage()); //utilizando mensagem ca classe ValorInvalidoException
        }

        contas1.put("diretor", c1);
        contas1.put("gerente", c2);
        System.out.println("Diretor " + contas1.get("diretor").getSaldo());
        System.out.println("Gerente " + contas1.get("gerente").getSaldo());

        System.out.println("Quantidade de contas " + contas.size());

    }
}

Não consegui entender, o que fiz de errado, na utilização do método "Set contas = new HashSet();"

Na metodo hashCode, na classe Contas, utilizei como base nome e numero e mesmo enviando informações diferente sempre retona 1 como quantidade de contas

Nomes Guilherme Guilherme 3 2

Contas Quantidade de contas 1 Diretor 4000.0 Gerente 2000.0 Quantidade de contas 1

1 resposta
solução!

Amigo, já descobri seu problema. Ele esta no construtor da classe ContaCorrente. Veja:

public ContaCorrente(int numero, String nome) { // TODO Auto-generated constructor stub return; }

Ora, você não seta o numero e nome da conta. Você não faz nada com o os dados passados para o construtor!

E eu vi mais problemas ainda. Olhe seu setNumero da classe Conta:

public int setNumero(int numero) { return this.numero; }

Você não seta o numero da conta! Apenas retorna um valor. O set não deve ser feito assim, deveria ser feito assim:

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

e o construtor assim:

public ContaCorrente(int numero, String nome) { this.setNumero(numero); this.setNome(nome); return; }

Fazendo isso já temos um resultado diferente do começo, aonde exibe o numero 2 para o número de contas. Do jeito que o seu código está, o hashcode das contas está igual, pq ambas contas não estão com nome nem numero setadas.

Aconselho estudar um pouco mais e fixar um pouco mais setters, getters, contrutores e afins, coisa básica do Java.

Abração!