Pessoal, quando eu ordeno um array, por exemplo, com um comparator, na hora de usar o binarySearch eu preciso passar o comparator também para obter o resultado satisfatorio. Agora se eu nao passo o comparator, me retorna um numero inesparado como “-1” por exemplo.
Tenho feitos alguns exercicios e nos exercicios contém um retorno como -1, -5 e -3. Eu escolho uma resposta com o retorno de -1 pois no livro da Kathy fala que “normalmente” é -1. Porém a resposta era -5. Tem algum critério para usar, para saber qual numero negativo o binarySearch vai retornar?
Se você usar errado o binarySearch, ele vai lhe retornar um número indefinido. Por exemplo, se você não passar o mesmo comparator na hora de ordenar e de procurar, vai lhe retornar um número incorreto.
Se você usar adequadamente o binarySearch, ele lhe retorna exatamente o que está escrito na documentação - a posição onde você acharia o valor, se ele estivesse nesse vetor, mais um, e então multiplicada por -1.
E
entanglement
Para você entender melhor.
importjava.util.Arrays;classTesteBinarySearch{publicstaticvoidmain(String[]args){int[]dados={1,3,5,7,11,13,17,19,23,29,31};intpos;pos=Arrays.binarySearch(dados,2);System.out.println(pos);// -2 porque se estivesse no vetor, ficaria em dados[1]. 1 + 1 = 2pos=Arrays.binarySearch(dados,4);System.out.println(pos);// -3pos=Arrays.binarySearch(dados,9);System.out.println(pos);// -5pos=Arrays.binarySearch(dados,15);System.out.println(pos);// -7pos=Arrays.binarySearch(dados,18);System.out.println(pos);// -8}}
ViniGodoy
Sempre leia com a atenção a documentação. E por documentação, dizemos o javadoc e as especificações da VM, não o livro da Kathy.
evertonsilvagomesjav
Nó entanglement, explicação perfeita cara, brigadão!
Vini, vou ler mais atentamente a documentação :thumbup:
evertonsilvagomesjav
Cara fiz o teste aqui pra ver, mas nao deu certo:
staticclassComparaimplementsComparator<String>{@Overridepublicintcompare(Stringarg0,Stringarg1){// TODO Auto-generated method stubreturnarg1.compareTo(arg0);}}publicstaticvoidmain(String[]args)throwsMyException,FileNotFoundException,IOException{String[]dados={"map","pen","marble","key"};Comparacomp=newCompara();Arrays.sort(dados,comp);for(Stringn:dados){System.out.println(n);}System.out.println(Arrays.binarySearch(dados,"map"));//imprime -1.
Era pra imprimir -3 não? Pois map ordenado inversamente ficaria na posição dados[2], +1 * -1 = -3. Não seria isso?
E
entanglement
Quando você usa um comparador diferente no sort e no binarySearch, o resultado do binarySearch é indefinido.
evertonsilvagomesjav
entanglement:
Quando você usa um comparador diferente no sort e no binarySearch, o resultado do binarySearch é indefinido.
Se você usar errado o binarySearch, ele vai lhe retornar um número indefinido. Por exemplo, se você não passar o mesmo comparator na hora de ordenar e de procurar, vai lhe retornar um número incorreto.
Se você usar adequadamente o binarySearch, ele lhe retorna exatamente o que está escrito na documentação - a posição onde você acharia o valor, se ele estivesse nesse vetor, mais um, e então multiplicada por -1.
Nó kkk, vlw de novo!!!
Gustavo_Santos
Bom, eu fiquei com uma dúvida agora, porque se eu trocar a ordem aqui assim :
returnarg0.compareTo(arg1);
Mesmo não passando o Comparator, ele retorna 1. Tipo classifiquei com um comparator e não passai o comparator na hora da pesquisa,
tinha que ter retornado um valor inconsistente não ?!
returnarg0.compareTo(arg1);// dessa forma ele entraria na posição (3 + 1) * -1 = -4
returnarg1.compareTo(arg0); // porque assim ele retorna -5
ViniGodoy
Quando você usa o binary search num comparable, ele leva em consideração a ordem do comparable. Como a do String (que é um Comparable) é idêntica a do seu comparador, deu certo.