Preciso saber se o método contains() da classe TreeSet busca por palavra ou por letra.
Isso eu já vi, mas não consegui achar aí
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
Abraço.