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

Que código vc usou para remover a conta do array, eu simplesmente n vi

Não consigo entender se vc realmente apagou a conta do array, ou só sobrescreveu, se realmente foi apagado não consigo identificar o trecho de código responsável por isso.

2 respostas
solução!

Olá Augusto,

você se refere a esta solução do exercício?

    public void RemoveConta(Conta c)
    {
        comboBox.Items.Remove(c);
        int i;
        for(i = 0; i < this.numeroDeContas; i++)
        {
            if(this.contas[i] == c)
            {
                break;
            }
        }
        while(i + 1 <= this.numeroDeContas)
        {
            this.contas[i] = this.contas[i + 1];
            i++;
        }
    }

Esta solução de fato está removendo a conta do array e remanejando todos os elementos para que não fiquem buracos.

A ideia é que num array de Conta, cada posição do array guarda uma referência para um objeto, não o objeto em si. Vamos supor que temos 4 objetos:

  1. Objeto ContaCorrente na posição de memória XPTO

  2. Objeto ContaPoupanca na posição de memória ABDC

  3. Objeto ContaCorrente na posição de memória KLMN

  4. Objeto ContaPoupanca na posição de memória PTBR

Se eu adicioná-los em um array de conta de 5 posições, por de baixo dos panos na verdade ele está assim:

[ XPTO, ABCD, KLMN, PTBR, null ]

Agora vamos supor que quando eu chamar o método RemoveConta eu queria remover a 2° conta. Ou seja, no fundo estarei querendo remover a referência para o ABCD. E esta informação quem terá será o parâmetro c do método.

Então o que o primeiro laço do for no método faz é procurar qual a posição está localizado esta conta que quero remover do array e marca em i esta posição:

int i; //posição da conta a ser removida
for(i = 0; i < this.numeroDeContas; i++)
{
    if(this.contas[i] == c) //encontrei a conta na posição
    {
        break;
    }
}

No nosso exemplo, se quero remover a conta ABCD então o i no final deste for terá o valor de 1. Depois de achar a posição, o que o while faz é mover todo mundo que está a direita do elemento que queremos remover mover uma casa para a esquerda:

while(i + 1 <= this.numeroDeContas)
{
    this.contas[i] = this.contas[i + 1];
    i++;
}

Então no nosso caso, na primeira iteração deste laço em que o i está valendo 1, quando ele fizer this.contas[i] = this.contas[i + 1] no fundo o que ele vai fazer é this.contas[1] = this.contas[2]. Ou seja, nosso array que estava assim:

[ XPTO, ABCD, KLMN, PTBR, null ]

vai ficar assim agora:

[ XPTO, KLMN, KLMN, PTBR, null ]

E o i vai incrementar em 1, ou seja, agora ele vale 2. Quando executar novamente o laço, ai ele vai colocar na posição 2 o elemento em 3:

[ XPTO, KLMN, PTBR, PTBR, null ]

E por fim o elemento na posição 3 recebe o da posição 4:

[ XPTO, KLMN, PTBR, null, null ]

Note como de fato o elemento na segunda posição sumiu do array. O objeto ainda existirá na memória, pelo menos enquanto tiver alguma variável referenciando para ele. Mas pelo menos do array ele foi removido.

Entendi, mto obrigado.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software