Dúvida com Arrays.binarySearch()

Eu estava fazendo o mock da enthuware, quando surgiu uma dúvida a qual eu ainda não consegui resolver, abaixo vou escrever dois códigos, um com um teste simples com um array de string o qual o metodo bynarySearch() irá fazer a busca pelo pela ordenação natural, e o outro com a questão do mock:

MyComparator:

[code]import java.util.Comparator;

class MyStringComparator implements Comparator
{
public int compare(Object o1, Object o2)
{
int s1 = ((String) o1).length();
int s2 = ((String) o2).length();
return s1 - s2;
}
}
[/code]

classe de Teste

import java.util.Arrays;

public class TesteComparator {
	static String[] sa = { "a","c","d" };

	public static void main(String[] args) 
	{
		MyStringComparator comp = new MyStringComparator();
		int binarySearch = Arrays.binarySearch(sa, "b");
		System.out.println(binarySearch);

	}
}

De acordo com o livro da Kathy Sierra, estaremos recebendo um ponto de inserção para buscas mal sucedidas, tal ponto poderá ser calculado da seguinte forma:

(-(ponto de inserção) - 1), e diz também que “0” é um indice que indica uma busca válida certo?

Sendo assim rodando esse código se tem a saída:

Ou seja o ponto de inserção seria (-(-2)-1), o qual nos mostra que seria o segundo elemento com indice igual a 1, tudo isso para mostrar que realmente, a coisa está certa.

Porém no teste do mock tem o seguinte código como abaixo:

[code]import java.util.Arrays;

public class TesteComparator {
static String[] sa = { “d”,“bbb”,“aaaa” };

public static void main(String[] args) 
{
	MyStringComparator comp = new MyStringComparator();
	int binarySearch = Arrays.binarySearch(sa, "c", comp);
	System.out.println(binarySearch);

}

}
[/code]

Ao executar esse código se tem o seguinte retorno:

Ou seja, o codigo 0, que segundo o livro e de acordo com o código acima é um resultado para uma busca válida!

Na minha concepção essa busca deveria retornar -2, pois o ponto de inserção para c, seria o indice 1, pois no indice 0 já existe um elemento!, Olha o que a explicação do mock diz:

Alguém poderia me ajudar?

Obrigado.

Nossa, eu vou ter q ler essa parte do livro umas 3 vezes pra entender.
Mas o q eu entendi foi o seguinte. Na primeira classe de Teste

import java.util.Arrays;

public class TesteComparator {
	static String[] sa = { "a","c","d" };

	public static void main(String[] args) 
	{
		MyStringComparator comp = new MyStringComparator();
		int binarySearch = Arrays.binarySearch(sa, "b");
		System.out.println(binarySearch);

	}
}

não é usado o MyStringComparator. Portanto deve ser usado o compareTo q está sobreposto na classe String. Então a ordenação fica:

a, c, d

Como o “b” não é encontrado na pesquisa ele retornará o ponto de inserção, que será negativo para não ser confundido com uma busca bem sucedida. Só q eu não entendi direito a lógica do número a ser retornado. Nesse caso para o “b” ficar na ordem, ele deveria ficar na segunda posição, logo depois do a, por isso é retornado -2?

Já na segunda classe de teste

import java.util.Arrays;

public class TesteComparator {
	static String[] sa = { "d","bbb","aaaa" };

	public static void main(String[] args) 
	{
		MyStringComparator comp = new MyStringComparator();
		int binarySearch = Arrays.binarySearch(sa, "c", comp);
		System.out.println(binarySearch);

	}
}

é usado o MyStringComparator na pesquisa. Isso ficou confuso pra mim agora, mas acho q não será pesquisado algum “c”, e sim uma String q tenha o mesmo tamanho q c, ou seja, 1. Como nesse caso a ordenação fica:

d, bbb, aaaa

é retornado o index 0.

Vou fazer mais testes para ver se eu entendo melhor.

Obrigado pela sua atenção, e depois de alguns momentos lendo e relendo, realmente você tem razão, ele procura pelo tamanho, e como encontra na posição 1, ele retorna o indice 0, ou seja encontrou na lista!