Outra duvida sobre HashSet

7 respostas
fishyhatguy

Estou desenvolvendo uma aplicação onde há um hashset de usuários e dentro deste hashset há um hashmap de amigos (Que herda usuários).
Ao remover um usuário do hashset, devo remover também o amigo correspondente ao usuário dentro do hashmap de amigos dos outros usuários.
Como posso fazer isso iterando o hashset?

Exemplo do código que implemento:

public static void removerUsuario () { 

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

        else{

            String log; //Será usada também para remover o amigo no hashmap
            Usuario u = new Usuario();

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

            Iterator i = usuarios.iterator();

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

                    if(log.equalsIgnoreCase(u.getLogIn()) && usuarios.contains(u)) i.remove(); //Remove Usuário da HashSet

                   // else *Caso este não seja o usuario que deve ser removido, remover o amigo correpondente a ele do hashmap dentro de usuários*

            }

        }

    }

7 Respostas

BrunoBastosPJ

Implemente o método equals e hashCode na classe Usuário. Assim você só precisa chamar o método hashSet.remove(usuario) e hashMap.remove(usuario) e ambos serão removidos.

Dê uma pesquisada no fórum sobre os dois métodos e você vai achar bons exemplos.

fishyhatguy

Acontece que Amigo (apesar de herdar de Usuários) e Usuário são classes diferentes, e os dados nas coleções tem referências a objetos distintos. Isso então não ajuda muito ಠ_ಠ
Não há como fazer isso usando i.next()?

Gustavo_MPO

Se entendi o que vc quer fazer, basta vc iterar sobre o map de amigos dentro de cada nó do hashset de usuarios procurando pelo “usuario amigo” a ser removido.

fishyhatguy

sim, mas há duas observações:

1-Não há como iterar o map, mas pra isso há o login do usuário, que é a key correspondente no hashmap
2-O problema é que não consigo acessar o hashmap enquanto itero o hashset.

Gustavo_MPO

Na classe HashMap existe um metodos para obtenção de sets tanto de keys como values, vc pode iterar para qual achar mais adequado.
Sobre não conseguir acessar o hashMap na iteração do hashset, não entendo o porque.
Imagino que sua classe usuario tenha um hashmap amigos, não?
Se for isso, basta vc obter o hashmap (u.getHashMap() ou qualquer que seja o metodo que vc criou para acessar o hashmap) e iterar sobre ele (keySet ou values).

fishyhatguy

Eu tento pegar o usuario numa variável (u) e retirar o amigo por ela, mas por alguma razão não funciona. Por isso tento tirar direto do HashSet.
Eu tentei fazer assim:

while(i.hasNext()){  
                      
                   u = (Usuario) i.next();  
   
                   if(log.equalsIgnoreCase(u.getLogIn()) && usuarios.contains(u)) i.remove(); //Remove Usuário da HashSet  
                   
                   else  u.getListaAmigos().remove(log); /**Caso este não seja o usuario que deve ser removido, remover o amigo correpondente a ele do hashmap dentro de usuários*
                                                                             log = key do HashMap que corresponde ao login do usuario que é removido */
  
}
Gustavo_MPO

Verifique se a key é a correspondente em seu HashMap de amigos mesmo, veja o código abaixo, a remoção de um nó na iteração de um set (com hashmap dentro) funciona perfeitamente:

public class Program {
	public static void main(String[] args) {
		Amigo amigo1 = new Amigo();
		amigo1.hash.put("primeiro","aaaa");
		amigo1.hash.put("segundo","bbbb");
		
		Amigo amigo2 = new Amigo();
		amigo2.hash.put("terceiro","ccccc");
		amigo2.hash.put("quarto","ddddd");
		
		HashSet<Amigo> hsamigos = new HashSet<Amigo>();
		hsamigos.add(amigo1);
		hsamigos.add(amigo2);
		
		Iterator<Amigo> it = hsamigos.iterator();
		while(it.hasNext()){
			Amigo amigo = it.next();
			amigo.hash.remove("primeiro");
		}
		System.out.println(amigo1.hash.keySet() +" - "+ amigo1.hash.values());
	}

}

class Amigo{
	HashMap<String,String> hash = new HashMap<String,String>();
}
Criado 21 de junho de 2010
Ultima resposta 22 de jun. de 2010
Respostas 7
Participantes 3