Tabela HASH

Pessoal,

Tô querendo fazer um índice remissivo usando uma tabela HASH onde
cada palavra inserida na tabela iria para a posição certa de acordo com
a primeira letra

EX:

[0] - a, abacate, avatar
[1] - b, bala,bola
[2] - c , casa, camelo
[3] - d, dado dedo
[4]


[26] - z, zebu, zulu

e a função hash ficou assim .

private int hash(String palavra)
{    
       palavra = palavra.toLowerCase();
       return palavra.charAt[0] - 97;
}

desta forma :
a = A = 0
b = B = 1

z = Z = 25

entretanto quando a primeira letra possui acento eu danço !
alguma sugestão pra me ajudar ?

bom o metodo length() traz o tamanho da sua string e vc pode percorrer ela usando chatAt() que inicia do 0. lembrando que para usar codigo hash… é interessante vc implementar o metodo hashCode() para ter iteração de forma eficiente… :smiley:

conheço os dois métodos
entreta’nto o que eu queria era que

quando a primeira letra de qualquer palavra
tivesse acento, o acento fosse ignorado …

Ágatha = Agatha

não sei se conseguir explicar o que eu tava tentando fazer…
:roll:

Você quer remover acentos das palavras, não? Só conheço um jeito rápido de fazer isso, que é na base da "força bruta". Ou seja, algo como "se for "á", trocar por "a" e assim por diante.)
(É claro que se você for usar só letras acentuadas da língua portuguesa você pode levar em conta que o valor numérico delas não passa de 256, e indexar um array por elas. Por exemplo, você poderia criar um array de caracteres com 256 posições, onde o índice é o código da letra acentuada, e o valor é o código da letra sem acento. Vou dar um exemplo:

class RemoverAcentos {
    static String acentuado = "çÇáéíóúýÁÉÍÓÚÝàèìòùÀÈÌÒÙãõñäëïöüÿÄËÏÖÜÃÕÑâêîôûÂÊÎÔÛ";
    static String semAcento = "cCaeiouyAEIOUYaeiouAEIOUaonaeiouyAEIOUAONaeiouAEIOU";
    static char[] tabela;
    static {
        tabela = new char[256];
        for (int i = 0; i < tabela.length; ++i) {
	    tabela [i] = (char) i;
        }
        for (int i = 0; i < acentuado.length(); ++i) {
            tabela [acentuado.charAt(i)] = semAcento.charAt(i);
        }
    }
    public static String remover (final String s) {
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < s.length(); ++i) {
            char ch = s.charAt (i);
            if (ch < 256) { 
                sb.append (tabela [ch]);
            } else {
                sb.append (ch);
            }
        }
        return sb.toString();
    }
    public static void main(String[] args) {
        String s = "Gisele Bündchen da Conceição e Silva foi batizada assim em homenagem à sua 

conterrânea de Horizontina, RS.";
        s = RemoverAcentos.remover (s);
        System.out.println (s);
    }
}

Veja se ele imprime a frase original sem acentos ou não.

Cara valeu ! era isso mesmo o que eu queria !
vou tentar entender tudo que você fez e
qualquer coisa posto denovo !

Valeu !

thingol,

eu andei estudando o que você postou e estou com uma dúvida :oops:
dei uma olhada aqui no forum e não achei nenhum exemplo pra tentar entender …

como funciona essa estrutura de código ?

[code]static {

}[/code]

primeira vez que eu vejo um static " solto " !

É um bloco estático.
Será executado na primeira carga da classe.

Lembrese que por ser estático acessa apenas elementos estáticos da própria classe.

Mas tente fugir desse tipo de coisa.
Já vi coisas meio malucas acontecendo nesses blocos estáticos.

Valeu.

é por isso que ele declarou todas as variáveis estáticas ?
e o que você chama de “primeira carga da classe” ?

Na verdade quanto as variaveis estáticas.
Deve ter feito assim para poder chamar esses métodos sem instanciar um novo objeto.
Mas quanto ao atributo tabela, esse sim deve ser estático para poder ser acessado do bloco.

Agora falando sobre a carga da classe.
Quando um objeto é instanciado, se ele nunca foi utilizado antes, o java busca a classe e carrega no chamado “classloader” em memória (PermGen);