A busca na TreeSet funciona por palavra ou letra?

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

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

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

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.

É 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.

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.

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:

[code]
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;

}[/code]

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