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.
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.
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:
Objeto ContaCorrente na posição de memória XPTO
Objeto ContaPoupanca na posição de memória ABDC
Objeto ContaCorrente na posição de memória KLMN
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.