Problema para remover objeto de HashSet[Resolvido]

3 respostas
fishyhatguy

Quero remover um objeto já existente num HashSet, mas quando eu tento removê-lo resulta em uma exceção, apesar do código não estar (aparentemente?) errado.
Eis o código:

public static void removerUsuario () { 

        if(usuarios.isEmpty())
            System.out.println("Nao ha usuarios registrados.");

        else{

            String log;
            Usuario u = new Usuario();

            System.out.println("Digite o usuario que deseja remover: ");
            log = in.nextLine();

            Iterator i = usuarios.iterator(); //usuarios é o HashSet do tipo Usuário, nota: é estática

            while(i.hasNext()){
                    
                    u = (Usuario) i.next();

                    if(log.equalsIgnoreCase(u.getLogIn()) && usuarios.contains(u)) usuarios.remove(u);

            }

        }

    }

Alguém pode me ajudar a compreender o que há de errado aí?

3 Respostas

E

Para remover um elemento de um hashset, você deve usar o remove do Iterator, não o remove do HashSet. É que o remove do HashSet invalida o Iterator, fazendo com que ele lance uma exceção.
Quando você usa o remove do Iterator, ele fica sabendo que você quer remover o elemento certo, e não fica inválido (não se perde).

fishyhatguy

Entendi…Muito obrigado pela ajuda então!
Agora está funcionando bem.

E

Dica: os nomes que listei abaixo são nomes de que seres?

import java.util.*;

class RemoverElementosHashSet {
    public static void main (String[] args) {
        Set<String> s = new HashSet<String>();
        s.add ("Metatron");
        s.add ("Cassiel");
        s.add ("Gazardiel");
        s.add ("Muriel");
        s.add ("Zagzagel");

        // Imprime "[Muriel, Zagzagel, Cassiel, Gazardiel, Metatron]"
        System.out.println (s);

        for (Iterator<String> it = s.iterator(); it.hasNext(); ) {
            String t = it.next();
            if (t.equals ("Gazardiel"))
                it.remove();
        }
        // Note que agora imprime "[Muriel, Zagzagel, Cassiel, Metatron]"
        System.out.println (s);
    }
}

O nome “Metatron” não parece nem um pouco ser hebraico. Na verdade, parece até um nome de robô, o que não é o caso.

Criado 20 de junho de 2010
Ultima resposta 21 de jun. de 2010
Respostas 3
Participantes 2