A busca na TreeSet funciona por palavra ou letra?

7 respostas
Andre_Brito

Preciso saber se o método contains() da classe TreeSet busca por palavra ou por letra.

7 Respostas

fabiozoroastro

http://java.sun.com/j2se/1.4.2/docs/api/java/util/TreeSet.html#contains(java.lang.Object)

Andre_Brito

Isso eu já vi, mas não consegui achar aí :confused:
Valeu.

ViniGodoy

Ele vai usar o comparator para procurar o elemento, e achará aquele que o valor de retorno for 0.
Não entendi o direito o que você quis dizer com “por letra” e “por palavra”.

Mas creio que seja a última opção… apenas palavras inteiras serão encontradas.

Andre_Brito

É assim: tenho uma lista em txt ordenada por ordem alfabética. Eu quero percorrer por letras para a busca se tornar mais rápida. Porque imagine para uma lista em .txt de 20 MB (muitoooo grande). Demora bastante se for necessário procurar a palavrar “world” (começaria desde o a, b, c, …). Na verdade, é um trabalho de uns amigos meus, mas quero ajudar eles a fazer.

ViniGodoy

Ah… agora entendi o que você queria perguntar. A comparação do compareTo da string é feita letra-a-letra.

Mas, mesmo que não fosse assim, não creio que demoraria tanto assim. O TreeSet organiza as palavras numa árvore binária. Então, o número de comparações não deve ser assim tão grande. O que o java garante é que o tempo será, na notação do Big-O, O(log(n)), o que é bastante bom.

Só um detalhe. Se as palavras forem acentuadas, talvez seja uma boa usar um Collator ao invés do comparador da string diretamente. O collator usa a ordem da palavra como ela é encontrada num dicionário, não a ordem dela na tabela Unicode.

ViniGodoy

PS: Você poderia resolver sua dúvida abrindo o código fonte da classe String e vendo o compareTo. As vezes é uma boa o fato do Java ser Open Source.

Dê uma olhada:
public int compareTo(String anotherString) {
    int len1 = count;
    int len2 = anotherString.count;
    int n = Math.min(len1, len2);
    char v1[] = value;
    char v2[] = anotherString.value;
    int i = offset;
    int j = anotherString.offset;

    if (i == j) {
        int k = i;
        int lim = n + i;
        while (k < lim) {
            char c1 = v1[k]; //Compara a letra no índice k dessa string
            char c2 = v2[k];//Com a letra no índice k da outra string
            //Se forem diferentes, retorna negativo se c1 < c2 ou positivo se c1 > c2
            if (c1 != c2) {    		    
                return c1 - c2;
            }
            k++;
        }
    } else {
        while (n-- != 0) {
            char c1 = v1[i++];
            char c2 = v2[j++];
            if (c1 != c2) {
                return c1 - c2;
            }
        }
    }
    return len1 - len2;
}
Andre_Brito

Muito obrigado ViniGodoy.
Tirou muitas dúvidas :smiley:
Abraço.

Criado 20 de novembro de 2007
Ultima resposta 20 de nov. de 2007
Respostas 7
Participantes 3