Estou estudando pra certificacao e entrei no topico de busca de Arrays e Collections…Dae apareceu uma duvida.
Ele diz que o metodo retorna um valor positivo ou o valor 0 indicando que a busca foi bem sucessidida e retorna numero negativo indicando pontos de insercao e busca mal sucedida. O que é esse ponto de insercao e como é feito o calculo para retorna-lo? No livro ele diz assim:
(-(ponto de insercao)-1)… eu nao entendi…
Você não implementou o “equals” (embora isso não seja explicitamente descrito na documentação, ele só irá retornar um valor positivo se a classe implementar “equals” corretamente).
EDIT - falei besteira; não é preciso implementar “equals”. Só olhar o fonte do JDK.
Mesmo assim nao entendi… desculpe a minha falta de inteligencia…
ViniGodoy
Como eu expliquei ali em cima, você deve estar usando critérios diferentes para a comparação e para a igualdade.
Além disso, quando você não deixa explicito qual comparador usar no binary search, ele vai olhar se a classe pessoa é comparable, e usar a ordem natural da classe pessoa (que deve ser por nome) para fazer a busca, ao invés de usar a ordenação feita pela segunda vez (por idade).
Isso vai mesmo deixar a busca um tanto maluca.
O segredo é usar o mesmo comparator tanto para a ordenação, quanto para o BinarySearch.
Mude o seu segundo binarySearch para: System.out.println("\ndiego" + Arrays.binarySearch(p,new Pessoa(“diego”,15), r));
Que deve funcionar.
D
diogosmg
Perceba duas observações sobre o código:
1- A implementação de compare() da interface Comparable está implementando uma lógica de classificação alfabética por nome;
2- Na segunda chamada ao método binarySearch, o array foi classificado usando-se um Comparator, mas este não foi informado na chamada do método, o que causa resultados inconsistentes. O código seria então:
Arrays.binarySearch(p,newPessoa("diego",15),r);
Além disso, como o Thingol mencionou, o método equals() deve ser implementado para a recuperação do objeto correto (senão será fornecida a implementação de Object, que retorna false para instancias diferentes, embora seus conteúdos sejam equivalentes).
O
omaisnormalbaba
Eu entendi… mas só pra gerar uma polêmica e sanar a minha duvida…pq que se eu alterar o codigo de :
// que retorna -3
Arrays.binarySearch(p,new Pessoa("diego",15)));
Para
// que retorna 2
Arrays.binarySearch(p,new Pessoa("jack",24));
Ambos estao usando a chamada sem passar o Camparator…