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

E se eu quisesse tirar uma conta?

Nico falou que poderíamos criar um método para tiramos uma conta, mas ele não fez, ao menos neste vídeo. Se fôssemos criar um método para fazer tal função, este estaria correto? Ou tem outra forma melhor de fazer?

public Conta tiraReferencia(int pos) {
        this.posicaoLivre--;
        return this.referencias[pos] = null;
    }
3 respostas
solução!

Olá Lucas,

Para melhorar a implementação desse método, caso o elemento removido não seja o último, poderia deslocar os objetos no array, a fim de eliminar o "buraco".

Se deixar buracos no array interno, vc pode ter problemas para pegar elementos nela. Por exemplo, vamos supor que sua lista tenha:

lista.pegaReferencia(0) // Conta 1
lista.pegaReferencia(1) // Conta 2
lista.pegaReferencia(2) // Conta 3
lista.pegaReferencia(3) // Conta 4
lista.pegaReferencia(4) // Conta 5
lista.getTamanho() // 5

Quando chamar lista.tiraReferencia(2), sua lista ficará assim:

lista.pegaReferencia(0) // Conta 1
lista.pegaReferencia(1) // Conta 2
lista.pegaReferencia(2) // null
lista.pegaReferencia(3) // Conta 4
lista.pegaReferencia(4) // Conta 5
lista.getTamanho() // 4

Veja que o getTamanho ficará correto, pois vc decrementou o atributo posicaoLivre, porém ao chamar lista.pegaReferencia(2), seu retorno será null. Não é bem isso que se espera após remover o elemento da segunda posição. Costumamos esperar que o terceiro ocupe sua posição. Afinal, não sabemos quais posições no meio da lista podem estar vazias.

O ideal é que sua implementação desloque os elementos das posições 3 e 4, removendo o buraco. Após a chamada lista.tiraReferencia(2), sua lista deveria ficar do seguinte modo:

lista.pegaReferencia(0) // Conta 1
lista.pegaReferencia(1) // Conta 2
lista.pegaReferencia(2) // Conta 4
lista.pegaReferencia(3) // Conta 5
lista.getTamanho() // 4

Esse é um exercício bacana. Tente fazer esse esquema do deslocamento.

Se tiver alguma dúvida a mais ou sobre algo que eu coloquei aqui, manda a pergunta aí em baixo.

Abs

Eric, valeu pela ilustração. Geralmente quando eu pergunto no fórum eu fico refletindo sobre a minha própria pergunta e vi a possibilidade de um problema desse tipo. Para solucionar o problema em questão, eu usaria o LinkedList:

    ContaCorrente cc1 = new ContaCorrente(11, 11);
    ContaPoupanca cc2 = new ContaPoupanca(22, 22);
    ContaPoupanca cc3 = new ContaPoupanca(33, 33);
    ContaPoupanca cc4 = new ContaPoupanca(44, 44);

    LinkedList<Conta> lista = new LinkedList<Conta>();
    lista.add(cc1);
    lista.add(cc2);
    lista.add(cc3);
    lista.add(cc4);

    System.out.println(lista.get(2));
    lista.remove(2);
    System.out.println(lista.get(2));

Seria essa a solução? Obrigado pela atenção! Abraço.

Fala Lucas,

Usar LinkedList ou outra das implementação de List é uma solução sim. Usar as classes padrões do Java pra resolver problemas comuns, como ter uma lista de objetos, é uma ótima solução.

Pro aprendizado, é interessante implementar as lógicas na mão pra poder praticar. Então seria um exercício interessante complementar sua versão do tiraReferencia pra deslocar os elementos.

Uma forma de fazer esse exercício, é pegar cada elemento que vem após a posição removida e passar ela pro índice anterior. Se removi o elemento 2, o elemento 3 será atribuído à posição 2, o 4 pra posição 3 e assim por diante até chegar no final da lista.

Abs