Buscar elemento em uma Collection

6 respostas
W

É possível encontrar(e retornar) um dado objeto em alguma Collection buscando por seu hashCode?

Estou com o seguinte problema: tenho que criar uma “pseudo-tabela de banco de dados” contendo algumas palavras e seus significados, e esta tabela deve ser serializada para ser realizada uma pesquisa posteriormente.

Há algumas palavras repetidas que devem ser registradas com significados diferentes (exemplo: ‘que’ deve ter um registro com seu significado caso seja conjunção, outro caso seja advérbio, outro pronome, etc.) e para isso tenho que usar um id para funcionar como chave primária (deve funcionar como se fosse um banco mesmo).

Pensei em sobrescrever o método equals() em minha classe Word para verificar a igualdade pelo id, e o hashCode() retornaria o código por palavra, isto é, cada objeto Word teria o hashCode da String atribuida a sua variável que guarda a palavra, assim, para verificar se determinado Word corresponderia a determinada palavra(String), compara-se os códigos hash.

Inicialmente pensei em usar um HashSet, pois, não permite repetição e a busca deve ser rápida, porém, vi que não daria para buscar elemento algum posteriormente.

Não sei se meu problema tem solução, mas colocarei a classe Word também, caso ajude a me ajudar :stuck_out_tongue:

public final class Word {

private int id;

private String word;

private String meaning;
Construtores...
Gets e sets...    

/**Verifica se o dado objeto é igual ao objeto Word. Objetos Word serão considerados iguais quando compartilharem o mesmo valor de id.
 * @param word - Objeto qualquer.
 * @return boolean - Resultado da comparação(verdadeiro ou falso).
 */
@Override
public boolean equals(Object word) {
    try {
        Word w = (Word) word;           
        return (getId() == w.getId());
    }
    catch (ClassCastException | NullPointerException ex) {
        return false;            
    }        
}

/**Objetos Word tem seus códigos hash definidos por seu atributo 'word'.
 * @return int - Valor do código hashing.
 */
public int hashCode(){
    return word.hashCode();
}

}

A propósito, uma vez serializado, o objeto só servirá para consultas, os elementos do Collection não serão alterados.

Agradeço desde já.

6 Respostas

W

O ideal é retornar hashcodes diferentes para objetos diferentes.

Por que você não compara a própria palavra para recuperá-la?

W

wagnerfrancisco:
O ideal é retornar hashcodes diferentes para objetos diferentes.

Por que você não compara a própria palavra para recuperá-la?

Eu teria que utilizar qual Collection para recuperá-la desta forma?
Digo, qual Collection devo usar para que fornecendo um Word ou uma String à lista ela me retornaria o objeto desejado, de forma que a premissa de que haja um código de identificação (id) para diferenciar cada significado distinto que a palavra pode possuir?
Não sei se apenas trocar o critério para considerar 2 objetos Word iguais para uma comparação por nomes atenderia esses requisitos.
Perdão caso eu tenha entendido mal o que você queria dizer.

W

wgenuino:
wagnerfrancisco:
O ideal é retornar hashcodes diferentes para objetos diferentes.

Por que você não compara a própria palavra para recuperá-la?

Eu teria que utilizar qual Collection para recuperá-la desta forma?
Digo, qual Collection devo usar para que fornecendo um Word ou uma String à lista ela me retornaria o objeto desejado, de forma que a premissa de que haja um código de identificação (id) para diferenciar cada significado distinto que a palavra pode possuir?
Não sei se apenas trocar o critério para considerar 2 objetos Word iguais para uma comparação por nomes atenderia esses requisitos.
Perdão caso eu tenha entendido mal o que você queria dizer.

Você pode percorrer os elementos de um Set ou List para encontrar os elementos que deseja.

Se quiser indexar pelas palavras, pode usar um Map:

Map<String, Set<Word>> palavras;
W

Entendi, uma outra pergunta, como manuseio o retorno todos os objetos ligados à uma mesma key? Ex: tenho 4 objetos ligados a uma key ‘x’, recebo os 4 e trabalho com as suas informações?

W

Foi por isso que sugeri que você utilizasse um Map com um Set. Quando você buscar pela key, vai receber um Set e percorrer os valores associados:

Set<Word> valores = palavras.get(key);
for each (Word word : valores) {
   //manipule word aqui...
}
W

Vlw, wagner. Vou ver o que consigo fazer =]

Criado 26 de agosto de 2012
Ultima resposta 26 de ago. de 2012
Respostas 6
Participantes 2