Remover objetoDAO de uma ArrayList - BUG

Criei um programa com uma List, que tem seus getters setters e tudo mais, nesse codigo para setar novas linhas dessa lista, tem-se o seguinte codigo:

 public void CriarLista (int mansos,int putos){ 
        blobsL = new ArrayList();
        numeros = new ArrayList();
        System.out.println("Criação da primeira lista: ");
        for(int i=0;i<(mansos+putos);i++){
        numeros.add(i);
        }
        int pop = mansos+putos;
        for(int i=0;i<pop;i++){ 
            
            if(mansos!=0){
                f = new blobsDAO(); //SEMPRE INSTANCIE UM NOVO OBJETO SEU JUMENTO
                f.setId(numeros.get(i));
                f.setTipo("MANSO");
                f.setPosicao(null);
                blobsL.add(f);
                System.out.println(f);
                mansos = mansos - 1;
                System.out.println("MANSO "+i+" ADICIONADO");
            }
            else if(putos!=0){
                f = new blobsDAO();
                f.setId(numeros.get(i));
                f.setTipo("PUTO");
                f.setPosicao(null);
                blobsL.add(f);
                putos = putos - 1;
                System.out.println("PUTO "+i+" ADICIONADO");
            }
            
        }
    } //FIM FUNÇÃO CRIAR LISTA

Funciona muito bem a questão de setar determinado Id,Tipo e posição desses objetos da List<>, tal como adicionar novos, porém quando tento remover alguns desses objetos acontece um bug muito estranho.

Criei uma função em caso do objeto possuir o valor de getPosição==null, nesse caso o objeto sera deletado, entretanto aparece um bug muito chato em que, ele deleta a primeira posição detectada como nulo, e as demais ele simplismente ignora.

Codigo abaixo:

public void EliminarBlob(){
    //ELIMINAR AQUELES SEM COMIDA
    System.out.println("Tamanho da lista: "+blobsL.size());
        for (int i = 0; i < blobsL.size(); i++) {
            if(blobsL.get(i).getPosicao()== null){
                System.out.println("Objeto a ser eliminado: "+blobsL.get(i).getId()+" - "+blobsL.get(i).getPosicao());             
                blobsL.remove(f);
            }else{
                System.out.println("Objeto sobrevivente: "+blobsL.get(i).getId());
            }
        }
    }

Seu remove faz referência a um objeto estático.
blobsL.remove(f);
Ou seja sempre vai remover f não importa quantos loop tenha.
Ajuste para pegar o objeto pelo índice do for tipo:
blobsL.remove(blobsL.get(i));

Fiz o que disse, porém o programa continua travado depois de checar a primeira posição reconhecida como nulo e ter apagado ela, é como se ele apagasse essa linha e depois desistisse de checar e apagar as outras. Fiz varios testes para ver especificamente onde travava, e é literalmente após remover essa linha que o meu FOR se acaba por algum motivo

public void EliminarBlob(){
    //ELIMINAR AQUELES SEM COMIDA
    System.out.println("Tamanho da lista: " + blobsL.size());
    for (int i = 0; i < blobsL.size(); i++) {
        blobsDAO elemento = blobsL.get(i); // não fica chamando get(i) o tempo todo, usa uma variável local
        if(elemento.getPosicao() == null) {
            System.out.println("Objeto a ser eliminado: " + elemento.getId() + " - " + elemento.getPosicao());
            blobsL.remove(f);
            i--; // decrementa o i, senão o i++ do for vai fazer ignorar o próximo elemento, já que você acabou de remover um
        } else {
            System.out.println("Objeto sobrevivente: " + elemento.getId());
        }
    }
}
1 curtida

Muito obrigado! Acho que isso literalmente acabou de resolver as outras funções que tinham um bug parecido, foi realmente uma falta de atenção minha, boa noite cara :sweat_smile:

1 curtida