Pessoal,
Estou usando um Set (LinkedHashSet) usando generics para uma classe Domain do meu sistema, mas na hora que dou um set.remove(domain); ele não está removendo o domínio passado, alguma idéia?
Obrigado,
Pessoal,
Estou usando um Set (LinkedHashSet) usando generics para uma classe Domain do meu sistema, mas na hora que dou um set.remove(domain); ele não está removendo o domínio passado, alguma idéia?
Obrigado,
Esse método retorna um boolean. Vc consegue verificar se retorna true?
Você se lembrou de implementar equals() e hashCode() corretamente nessa sua classe do domínio?
Se você não tiver ambos implementados corretamente o Set não vai saber que objeto remover.
A função está retornando false, sendo que posso garantir que o objeto está lá. Eu sobrescrevi o método equals da Object, mas não sobrescrevi o hasCode, precisa?
Obrigado,
Tem sim, senão o HashSet não vai achar o objeto no bucket correspondente.
Já o fiz, coloquei o hashCode, mas nem assim funcionou!
Estou usando lista mesmo, mas o ideal seria Set.
Você implementou o hashCode() corretamente? Dois objetos que são equals tem o mesmo hashCode()?
De modo geral:
Normalmente em meus programas acho mais útil ter as coisas em ordem crescente ou decrescente (para relatórios ou simplesmente para debugar alguma coisa) - embora seja mais lento (O(log(n)) em vez de O(1)) e gaste um pouco mais de memória, eu prefiro usar TreeSet e TreeMap.
Só uso HashSet, HashMap, LinkedHash, LinkedHashMap quando a chave é String e essa string já está normalizada para minúsculas e maiúsculas porque não tenho de definir hashCode e equals (que preguiça…)
Eu fiz algo bem simples, o meu bean Domain só tem dois atributos que importam, um é integer e outro string, então coloquei:
@Override
public int hashCode() {
return str.hashCode() + integer.hashCode();
}
Péssima idéia.
A regra é que dois objetos que são equals (que o método equals retornar true) devem, obrigatoriamente, ter o mesmo hashCode(). Implemente o método hashCode() garantindo isso e você não vai ter problemas 
Normalmente, para hashcode, você pode usar a geração feita pela própria IDE (acho que o Eclipse faz isso). Essa geração é algo como:
int retorno = 0;
if (campo1 != null) retorno = campo1.hashCode();
if (campo2 != null) retorno = retorno * 37 + campo2.hashCode();
if (campo3 != null) retorno = retorno * 37 + campo3.hashCode();
...
if (campoN != null) retorno = retorno * 37 + campoN.hashCode();
return retorno;
O valor mágico 37 (um número primo) é adequado para muitas aplicações, tanto é que é usado na implementação de hashCode da classe java.lang.String.
Mas do jeito que você fez normalmente está OK.
Pode ser que seu “equals” esteja errado. Será que não está parecido com isto?
@Override public int equals (Object obj) {
Domain dom = (Domain) obj;
return dom.str == this.str && dom.integer == this.integer;
}